2012-05-25 9 views
8

gebe ich habe den folgenden Code:IMultiValueConverter Verwendung auf mehrere CommandParameters zu Ansichtsmodell

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

Unterhalb der Code für PassThroughConverter ist:

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(); 
    } 
} 

Wenn ich so schnell debuggen, da es die Rückgabewerte Linie trifft , die richtigen Werte sind im Array , aber wenn ich den Knopf, der den Befehl filtergrid auslöst, drücken, sind die zurückgegebenen Werte beide null? Kann jemand helfen. Vielen Dank.

Antwort

12

Einige Experimente bestätigt, dass dies zu tun

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

Ergebnisse im Befehlsparameter auf, als object[] { null, null } endet.

Der Konverter wird jedes Mal ausgeführt, wenn sich ein gebundener Wert ändert, nicht wenn der Befehl ausgeführt wird, und der Rückgabewert wird zur Verwendung zwischengespeichert, wenn der Befehl ausgeführt wird. Der ursprüngliche Parameter object[] values scheint auf alle Nullen zurückgesetzt zu sein.

Die Lösung besteht darin, den Parameter values zu klonen. In Ihrem Fall können Sie dies tun:

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

sinnvoller kann eine variable Anzahl von Werten wie folgt behandelt werden:

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

Dank Phil, das mein Problem gelöst! – bewilderedprogrammer