2012-05-25 7 views
8

Tôi có đoạn mã sau:Sử dụng IMultiValueConverter để vượt qua nhiều CommandParameters để ViewModel

<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> 

Dưới đây là mã cho 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(); 
    } 
} 

Khi tôi gỡ lỗi càng sớm càng nó chạm vào dòng giá trị trả về , các giá trị chính xác nằm trong mảng nhưng khi tôi nhấn nút kích hoạt bộ lọcgridcommand, các giá trị trả về đều là null? Có ai giúp được không. Cảm ơn bạn.

Trả lời

12

Một số thử nghiệm khẳng định rằng làm điều này

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

kết quả trong tham số lệnh kết thúc như object[] { null, null }.

Trình biến đổi được chạy mỗi lần giá trị bị ràng buộc thay đổi, không phải khi lệnh được thực hiện và giá trị trả về được lưu trữ để sử dụng khi lệnh được thực thi. Tham số gốc object[] values dường như được đặt lại thành tất cả các giá trị rỗng.

Giải pháp là sao chép thông số values. Trong trường hợp của bạn, bạn có thể làm điều này:

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

một cách hữu ích hơn, một số biến của giá trị có thể bị xử lý như thế này:

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

Cảm ơn Phil, Đó là giải quyết vấn đề của tôi! – bewilderedprogrammer