如何根据属性值启用或禁用复选框?

3
在我的数据网格中,我有一个 DataGridCheckBoxColumn 实现:

<DataGrid ItemsSource="{Binding Collection}">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding Selected}"
                                ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}"
                                EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}">
         <DataGridCheckBoxColumn.CellStyle>
             <Style TargetType="DataGridCell">
                 <EventSetter Event="CheckBox.Unchecked" Handler="Match_Unchecked"/>
                  <Style.Triggers>

                                        <!-- Enabling -->
                                        <DataTrigger Binding="{Binding DataContext.IsAdding, 
                    RelativeSource={RelativeSource AncestorType=Window}}" Value="false">
                                            <Setter Property="IsEnabled" Value="True" />
                                        </DataTrigger>

                                        <!-- Disabling -->
                                        <DataTrigger Binding="{Binding DataContext.IsAdding, 
                    RelativeSource={RelativeSource AncestorType=Window}}" Value="True">
                                            <Setter Property="IsEnabled" Value="False" />
                                        </DataTrigger>

        </Style>
</DataGridCheckBoxColumn.CellStyle>

您可以看到我在DataGridCheckBoxColumnStyle上插入了一个DataTrigger,因此当属性IsAdding为false时,包含内容的Cell应该启用,否则禁用。

这似乎没有起作用,Cell甚至是启用的,为什么呢?


你尝试过将样式目标设置为CheckBox而不是DataGridCell吗?你的事件设置器是否有效? - XAMlMAX
@XAMlMAX CheckBox位于DataGridCell内部,我无法在一个里面有两个样式。 - MrFantastic
@XAMlMAX 如果我更改了“TargetType”,我会得到这个错误:“TargetType 'CheckBox'与项目'DataGridCell'的类型不匹配”。 - MrFantastic
1
FYI,我刚刚使用了你的代码(稍作修改以适应MVVM,用Button开关替换了你的EventSetter),但似乎它正在工作。 - zc246
1
好的,在那里你需要的是一个 ComboBox 的样式,但要想获得它,你需要定义列的模板,然后使用你定义的 x:Key 样式。这是因为模板不是视觉树的一部分,除非显式定义,否则样式将不会被应用。希望这讲得清楚。而且你还没有回答你的事件设置器是否起作用! - XAMlMAX
显示剩余2条评论
1个回答

0

我怀疑问题出在你的应用程序的逻辑树上。你那里的代码实际上应该可以正常工作,但是似乎你可能正在演示应用程序内部测试它。通常这没问题,但是添加了一个显示XAML的控件,导致逻辑树出现问题(我正在进行修复,但还没有完成)。

你可以通过对演示应用程序进行两个更改来解决这个问题:

  1. MainWindow.xaml中,用普通的ContentControl替换XamlDisplayerHost
  2. Grids.xaml中,用普通的StackPanel替换XamlDisplayerPanel

这样之后你的样式应该能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接