WPF datagridcheckboxcolumn: как включить / отключить флажки
У меня есть DataGrid с DataGridCheckBoxColumn. Сетка имеет привязку со списком объектов. Я хочу, чтобы, если есть N флажков, непроверенные становятся отключенными, но я не знаю, как выполнить отключение.
<DataGridCheckBoxColumn
x:Name="IsFixedByBracketColumn"
Header="Fissato con staffa"
Binding="{Binding isFixedByBracket, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="False">
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="CheckBox">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding
HasMaxNumberReached,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Value="true"/>
<Condition
Binding="{Binding
IsChecked,
RelativeSource={RelativeSource Self}}"
Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="False"/>
</MultiDataTrigger>
</Style.Triggers>
<EventSetter
Event="CheckBox.Checked"
Handler="DataGridCheckBoxColumn_Checked" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>
Код события:
private void DataGridCheckBoxColumn_Checked(object sender, RoutedEventArgs e)
{
CheckBox cb = (CheckBox)sender;
if (cb.IsChecked == true)
{
this.numberOfCheckboxesChecked++;
}
else
{
this.numberOfCheckboxesChecked--;
}
if (this.numberOfCheckboxesChecked >= maxNumOfPointsPerSide)
{
this.HasMaxNumberReached = true;
}
else
{
this.HasMaxNumberReached = false;
}
}
public bool HasMaxNumberReached
{
get {
return hasMaxNumberReached;
}
set {
hasMaxNumberReached = value;
RaisePropertyChanged("HasMaxNumberReached");
}
}
3 ответов:
Благодаря Магнусу в форуме MSDN, вот правильный ответ на проблему:
<DataGrid x:Name="grid" AutoGenerateColumns="False"> <DataGrid.Resources> <Style TargetType="CheckBox" x:Key="style"> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding HasMaxNumberReached, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="true"/> <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="false"/> </MultiDataTrigger.Conditions> <Setter Property="IsEnabled" Value="False"/> </MultiDataTrigger> </Style.Triggers> <EventSetter Event="CheckBox.Checked" Handler="DataGridCheckBoxColumn_Checked" /> <EventSetter Event="CheckBox.Unchecked" Handler="DataGridCheckBoxColumn_Checked" /> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridCheckBoxColumn x:Name="IsFixedByBracketColumn" Header="Fissato con staffa" Binding="{Binding isFixedByBracket, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" ElementStyle="{StaticResource style}" EditingElementStyle="{StaticResource style}"> </DataGridCheckBoxColumn> </DataGrid.Columns> </DataGrid>Здесь полная Тема
Да, вы можете сделать это с помощью триггеров , Вот так
<Style x:Key="MyCheckBoxStyle" TargetType="{x:Type CheckBox}"> <Style.Triggers> <Trigger Property="IsChecked" Value="False"> <Setter Property="IsEnabled" Value="False" /> </Trigger> </Style.Triggers>И вы можете применить этот стиль к своему флажку
Вы можете установить
DataGridCheckBoxColumn.ElementStyleдля включения / выключения ячейки, как описано ниже. Здесь предполагая, чтоHasMaxNumberReachedявляется свойством на вашем ViewModel, которые говорят, что количество max checkbox checked достигло.<DataGrid> <DataGrid.Columns> <DataGridCheckBoxColumn> <DataGridCheckBoxColumn.ElementStyle> <Style TargetType="Checkbox"> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding HasMaxNumberReached, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="true"/> <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="false"/> </MultiDataTrigger.Conditions> <Setter Property="IsEnabled" Value="False"/> </MultiDataTrigger> </Style.Triggers> <EventSetter Event="CheckBox.Checked" Handler="DataGridCheckBoxColumn_Checked" /> <EventSetter </Style> </DataGridCheckBoxColumn.ElementStyle> </DataGridCheckBoxColumn> </DataGrid.Columns> </DataGrid> private bool hasMaxNumberReached; public bool HasMaxNumberReached { get {return hasMaxNumberReached;} set { hasMaxNumberReached =value; RaisePropertyChanged("HasMaxNumberReached"); } }
Comments