问题:列表框内的WPF复选框已禁用,但仍可点击

时间:2018-11-16 13:04:36

标签: wpf checkbox

我有一个使用复选框的列表框样式。我想将每个复选框的isEnabled属性绑定到每个项目的属性(ItemEnabled)。这是我的代码:

<Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="{x:Type ListBoxItem}" >
                    <Setter Property="Margin" Value="2" />                    
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <CheckBox Focusable="False"                                    
                                    IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent} }"
                                    IsEnabled="{Binding Path=ItemEnabled, Mode=OneWay}">
                                    <ContentPresenter></ContentPresenter>
                                </CheckBox>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Setter.Value>
        </Setter>

到目前为止,将属性ItemEnabled设置为false的复选框为灰色。但是,仍可单击和可检查/不可检查。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则希望控制通过模型控制的复选框“ IsEnabled”,通过列表视图选择的选择控制“ IsChecked”。

您只需为模型创建DataTemplate即可

<DataTemplate DataType="{x:Type local:TestModel}">
    <StackPanel Orientation="Horizontal">
        <CheckBox IsEnabled="{Binding ItemEnabled}"
            IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem},Path=IsSelected}"
                  ></CheckBox>
        <TextBlock Text="{Binding Name}"></TextBlock>
    </StackPanel>
</DataTemplate>

TestModel:

public class Emp
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool ItemEnabled { get; set; }
}

从代码中删除“ ItemContainerStyle”。

希望这会有所帮助。

答案 1 :(得分:0)

谢谢,RajN。 我根据您的评论设法解决了这个问题。 这是新的XAML:

<Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2" />
                <Setter Property="Focusable" Value="False" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <ContentPresenter></ContentPresenter>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <CheckBox Focusable="False"
                                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=ListBoxItem} }"
                                      IsEnabled="{Binding Path=ItemEnabled, Mode=OneWay}"
                                      Content="{Binding Path=ItemName, Mode=OneWay}">
                            </CheckBox>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>