wpf datagridcheckboxcolumn:如何启用/禁用复选框
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19177525/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
wpf datagridcheckboxcolumn: how to enable/disable checkboxes
提问by FrancescoDS
I have a DataGridwith DataGridCheckBoxColumn. The grid has a binding with a list of objects. I want that, if there are N checkboxes checked, the unchecked become disabled, but I don't know how to perform the disable.
我有一个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>
Code for the event:
活动代码:
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");
}
}
采纳答案by FrancescoDS
Thanks to Magnus in MSDN Forum, here is the correct answer of the problem:
感谢 MSDN 论坛中的 Magnus,这里是问题的正确答案:
<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>
Herethe complete topic
这里是完整的主题
回答by Nitin
you can set DataGridCheckBoxColumn.ElementStyleto enable/disable cell as explained below. Here assuming HasMaxNumberReachedis a property on your ViewModel which tell that the count of max checkbox checked has reached.
您可以设置DataGridCheckBoxColumn.ElementStyle启用/禁用单元,如下所述。这里假设HasMaxNumberReached您的 ViewModel 上有一个属性,它告诉您检查的最大复选框数已达到。
<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");
}
}
回答by Mohd Ahmed
Yes you can do it with the help of Triggers, like this
是的,你可以在Triggers的帮助下做到这一点,就像这样
<Style x:Key="MyCheckBoxStyle" TargetType="{x:Type CheckBox}">
<Style.Triggers>
<Trigger Property="IsChecked" Value="False">
<Setter Property="IsEnabled" Value="False" />
</Trigger>
</Style.Triggers>
and you can apply this style to your checkbox
您可以将此样式应用于复选框

