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>
希望我理解了问题并且我的回答对您有所帮助。
目前我正在为组合框创建自定义样式。
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>
希望我理解了问题并且我的回答对您有所帮助。