WPF Binding auf mehreren Kriterien
In meinem MVVM, in Sicht ich habe ein DataGrid, wo ich Sie aktivieren möchten, die Zeilen-Elemente, basierend auf 2 Kriterien. DataGrid checkbox in 1 col (gebunden IsRowChecked Eigenschaft) und eine header-checkbox in einem anderen col. Ich möchte zum aktivieren der Zeile element, wenn
1) IsRowChecked ist wahr UND
2) Header-Feld ausgewählt ist.
Ist dieses mehrere Kriterien festlegen möglich ?
XAML
<DataGrid ItemsSource="{Binding SiList, Mode=TwoWay}" Name="dgvSiSelection">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsRowChecked, Mode=TwoWay}"/>
<DataGridTextColumn Header="" Binding="{Binding Header}" MinWidth="108" IsReadOnly="True"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Text="Number of Chemicals" Grid.Column="0" />
</Grid>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=NumberOfCases}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox IsEnabled="{Binding Path=IsRowChecked}" Text="{Binding Path=NumberOfCases, Mode=TwoWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<!-- Value1 chkValue11-->
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" Text="Value1" IsEnabled="{Binding ElementName=chkValue11, Path=IsChecked}" />
<CheckBox Name="chkValue11" Grid.Column="0" Width="16" />
</Grid>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value1}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox IsEnabled="{Binding ElementName=chkValue11, Path=IsChecked}" Text="{Binding Path=Value1, Mode=TwoWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<!-- Value2 chkValue12-->
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" Text="Value2" IsEnabled="{Binding ElementName=chkValue12, Path=IsChecked}" />
<CheckBox Name="chkValue12" Grid.Column="0" Width="16" />
</Grid>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value2}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox IsEnabled="{Binding ElementName=chkValue12, Path=IsChecked}" Text="{Binding Path=Value2, Mode=TwoWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
"Anzahl an Chemikalien" col müssen nur einzelne Kriterien verbindlich, was ich tun konnte. Wert1 & Wert2 muss 2 Kriterien, d.h. der IsRowChecked und header-Feld aktiviert ist. Ich könnte mit einzelnen, aber nicht bekommen können, eine Möglichkeit zum implementieren von 2 Kriterien ist in diesen Bindungen.
Wie kann ich erreichen diese Art der Bindung ???
Jede Hilfe wird sehr geschätzt.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sind zwei Möglichkeiten, die Arbeit mit komplexen Ausdrücke auf Bindungen:
MultiBinding
mit einem Konverter undMultiDataTrigger
mit bestimmten Fällen. Für Ihr Beispiel, die beide gut funktionieren.1. MultiBinding
Diese Methode funktioniert für praktisch jeden Fall aber erfordert die Implementierung von Konvertern (Sie wiederverwendet werden können, natürlich).
Erstellen
AndConverter
Klasse UmsetzungIMultiValueConverter
- Schnittstelle. Es muss zurücktrue
wenn alle Werte übergeben sind true (DependencyProperty.UnsetValue
ist ein spezieller Wert, wenn Wert nicht vorhanden).Fügen Sie den Konverter, um Ressourcen:
Angeben
DataTemplate
fürValue1
Spalte (original code ist kommentiert):2. MultiDataTrigger
Diese Methode funktioniert, wenn nur eine Eigenschaft-Wert-Konfiguration muss bestimmte Verhalten. In Ihrem Beispiel, das Textfeld ist immer deaktiviert, außer wenn beide Kontrollkästchen aktiviert sind. Die syntax ist komplexer, aber Konverter sind nicht erforderlich.
Angeben
DataTemplate
fürValue2
Spalte (original code ist kommentiert):MultiBinding
mit einem Konverter. EinMultiBinding
kann eine beliebige Anzahl vonBinding
s, Werte, die übergeben werden in einervalues
argumentIMultiValueConverter.Convert
Methode. Innerhalb dieser Methode können Sie einen logischen Ausdruck, den Sie wollen. Der code, den ich verwendet habe, inConvert
ist ein bisschen komplexer, weil es generische und prüft alle Möglichkeiten, aber im Grunde ist esreturn (bool)values[0] && (bool)values[1]
.