WPF DataBinding:如果使用 ComboBox "ItemsSource" 属性,如何绑定 ComboBoxItem 的 "IsEnabled"?

WPF DataBinding: How to bind "IsEnabled" of a ComboBoxItem if the ComboBox "ItemsSource" Property is used?

目前我正在为组合框创建自定义样式。

Current State of Styling

下一步应该是 ComboBoxItems 的 IsEnabled 状态。因此,我创建了一个简单用户 Class 和一个绑定到 ComboBox 的 UserList ObservableCollection。

public class User
{
    public int Id { get; private init; }
    public string Name { get; private init; }
    public bool IsEnabled { get; private init; }

    public User(int id, string name, bool isEnabled = true)
    {
        Id = id;
        Name = name;
        IsEnabled = isEnabled;
    }
}
<ComboBox
    ItemsSource="{Binding UserList}"
    DisplayMemberPath="Name"
    SelectedItem="{Binding SelectedUser}"
    IsEnabled="{Binding IsComboboxEnabled}"
    IsEditable="{Binding IsComboboxEditable}"
/>

要创建和测试 ComboBoxItems 的禁用样式,我想将用户的 IsEnabled 属性 绑定到 ComboBoxItem 的 IsEnabled 属性。

但我不能在这里使用 ItemContainerStyle,因为它会覆盖我的自定义样式:

<ComboBox
   ...
>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="IsEnabled" Value="{Binding IsEnabled}" />
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

那么:如何在不使用 ItemContainerStyle 或破坏我已经添加到 ComboBox 的自定义样式的情况下绑定 IsEnabled 属性?

如果您有不想覆盖的自定义 ComboBoxItem 样式,那么 ItemContainerStyle 中的样式应该有一个 BasedOn,它基本上会复制您的默认样式,然后 add/replace 包含任何内容:

<Style TargetType="ComboBoxItem" BasedOn="YourComboBoxItemStyle">

否则,如果您有 ComboBox 样式并想添加它,那么您可以在 ResourceDictionary 的样式中添加一个 Style.Resources 以 ComboBoxItem 为目标的样式:

<Style TargetType="ComboBox" x:Key="MyComboBoxStyle">
   <Setter .../>
   <Setter .../>
   <Style.Resources>
      <Style TargetType="ComboBoxItem">
         <Setter Property="IsEnabled" Value="{Binding IsEnabled}" />
      </Style>
   </Style.Resources>
</Style>

希望我理解了问题并且我的回答对您有所帮助。