我在一个视图中有一个组合框,它绑定到一个视图模型,该视图模型带有我的一个自定义类的ObservableCollection。这个自定义类只是一个Enum的 Package 器,它保存值和一个字符串,字符串是enum的描述属性。组合框将DisplayMemberPath属性设置为这个name属性,以显示更容易理解的描述属性值,而不是enum本身
我发现,当我将组合框的ItemsSource设置为这些Enum Package 类的集合,然后将SelectedItem属性设置为这些项之一时,当我启动应用程序时,UI中的组合框没有更新。如果我将其更改为字符串列表,它似乎可以工作。
下面是我的组合框:
<ComboBox
DisplayMemberPath="Name"
IsEditable="False"
IsReadOnly="True"
ItemsSource="{Binding SelectableTags}"
SelectedItem="{Binding SelectedTag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
我的自定义类组合框绑定到一个集合:
public class EnumNamePair : ObservableObject
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
private Enum enumValue;
public Enum EnumValue
{
get => enumValue;
set
{
SetProperty(ref enumValue, value);
Name = enumValue.GetEnumDescription();
}
}
public EnumNamePair(Enum enumValue)
{
EnumValue = enumValue;
}
}
我的视图模型的一部分:
private ObservableCollection<EnumNamePair> selectableTags = new();
public ObservableCollection<EnumNamePair> SelectableTags
{
get => selectableTags;
set => SetProperty(ref selectableTags, value);
}
private EnumNamePair selectedTag;
public EnumNamePair SelectedTag
{
get => selectedTag;
set => SetProperty(ref selectedTag, value);
}
public TaggingRuleViewModel(string tag)
{
SelectableTags = new List<EnumNamePair>(
Enum.GetValues(typeof(AllowedTag)).Cast<AllowedTag>().Select(x => new EnumNamePair(x)));
SelectedTag = SelectableTags.First(x => x.EnumValue.ToString() == tag),
}
我已经尝试过为我的绑定属性增加OnPropertyChanged,改变组合框上的Readonly/Editable属性设置器,简化我的视图模型/自定义类(它曾经有一个单独的getter用于name属性,而不是在设置EnumValue等时设置)。所有看起来有效的是将我的自定义类的列表更改为字符串列表,我知道还有其他方法可以处理在组合框中显示枚举描述属性的问题,但现在我只想知道为什么这样做不起作用。
1条答案
按热度按时间kpbwa7wx1#
转换器实现示例:
第一个问题