Dot-Net

使用 IMultiValueConverter 將多個 CommandParameters 傳遞給 viewModel

  • October 1, 2021

我有以下程式碼:

<DataGridTemplateColumn Header="Security">
   <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <Button Name="Security" Content="{Binding Path=totalSecurities}"
                   Command="{Binding Source={StaticResource viewModel}, Path=filterGridCommand}">
               <Button.CommandParameter>
                   <MultiBinding Converter="{StaticResource PassThroughConverter}">
                       <Binding Path="sector"/>
                       <Binding ElementName="Security" Path="Name"/>
                   </MultiBinding>
               </Button.CommandParameter>
           </Button>
       </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

下面是 PassThroughConverter 的程式碼:

public class PassThroughConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameters, CultureInfo culture)
   {
       return values;
   }

   public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
   {
       throw new NotImplementedException();
   }
}

當我一碰到返回值行進行調試時,正確的值在數組中,但是當我按下觸發 filtergrid 命令的按鈕時,返回的值都是空的?任何人都可以幫忙。謝謝你。

一些實驗證實這樣做

public object Convert(object[] values, Type targetType, 
                     object parameters, CultureInfo culture)
{
   return values;
}

導致命令參數以object[] { null, null }.

轉換器在每次綁定值更改時執行,而不是在執行命令時執行,並且在執行命令時記憶體返回值以供使用。原始參數object[] values似乎被重置為所有空值。

解決方案是複製values參數。在您的情況下,您可以這樣做:

public object Convert(object[] values, Type targetType, 
                     object parameter, CultureInfo culture)
{
   return new [] {values[0], values[1]};
}

更有用的是,可以像這樣處理可變數量的值:

public object Convert(object[] values, Type targetType, 
                     object parameter, CultureInfo culture)
{
   return values.ToArray();
}

引用自:https://stackoverflow.com/questions/10759523