在DataGrid中,我显示一个包含属性IsEnabled的项目列表,该属性由datagridviewcheckboxcolumn表示。 我想将要同时检查的复选框数量限制为5。
我怎么能这样做?
编辑:
我现在正在做的是使用多重绑定:转换器接受items对象的“IsEnabled”属性,并将项目列表本身作为输入值。
<DataGrid ItemsSource="{Binding MyItems}" AutoGenerateColumns="false"
CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="false">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="" Binding="{Binding Path=IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGridCheckBoxColumn.CellStyle>
<Style>
<Setter Property="CheckBox.IsEnabled" >
<Setter.Value>
<MultiBinding Converter="{Utilities:MyConverter}">
<Binding Path="IsEnabled" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
<Binding Path="DataContext.MyItems" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn>
...
MyConverter中的转换函数如下所示:
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var val1 = (bool)values[0];
int numSelected = 0;
if (values[1] != null && values[1] is ObservableCollection<MyTestItem>)
{
var list = (ObservableCollectionBase<MyTestItem>)values[1];
foreach (MyTestItem mti in list)
{
if (mti.IsEnabled)
numSelected++;
}
}
else
{
return false;
}
return val1 ? val1 : (numSelected < 5);
}
这可以按预期工作(可以同时选择不超过5个复选框,所有其他复选框都被禁用),但我不断收到警告:
System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=DataContext.MyItems; DataItem=null; target element is 'DataGridCell' (Name=''); target property is 'IsEnabled' (type 'Boolean')
我还尝试设置datagrids名称并在绑定中使用“ElementName”,但我仍然收到相同的警告,尽管行为是正确的。
为什么我会收到这些警告?
答案 0 :(得分:0)
在每个项目的ctr中传递集合。在IsEnabled属性上,如果当前集合具有5 IsEnabled = true,则拒绝True。
答案 1 :(得分:0)
向复选框选中的事件添加事件处理程序。检查基础数据源的记录以查看已检查的数量,并在已检查的事件大于5条记录时取消它。