无法将属性作为枚举绑定到 wpf mvvm 中的组合框



我有以下情况:

问题:无法将属性作为枚举绑定到 wpf mvvm 中的组合框?

如何将此枚举绑定到组合框?

1.我有一个枚举。

public enum RankType
{
StringValue1,
StringValue2,
StringValue3
} 

2.我在 myclass 中有一个属性作为枚举:

[DefaultValue(RankType.StringValue1)]
[ConvertUsing(typeof(EnumTypeConverter<RankType>))]
public RankType Rank { set; get; }

转换使用类,它为我做转换:

[System.AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class ConvertUsingAttribute:Attribute
{
private TypeConverter _converter = null;
public TypeConverter Converter
{
get
{
if (_converter == null)
_converter = (TypeConverter)System.Activator.CreateInstance(TypeOfConverter);
return _converter;
}
}
public Type TypeOfConverter
{
get;
private set;
}
public ConvertUsingAttribute(Type converterType)
{
this.TypeOfConverter = converterType;
}
}

枚举类型转换器类:

public class EnumTypeConverter<T>:TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(string);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value != null && value is string)
{
return Enum.Parse(typeof(T), (string)value);// int.Parse(((string)value).Trim());
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (value != null && destinationType == typeof(string))
{
return ((T)value).ToString();
}
return base.ConvertTo(context, culture, value, destinationType);
}
}

4.In 视图模型

private MilitaryRankType _selectedRankType;
public RankType SelectedRankType 
{  
get { return _selectedRankType; }
set
{
_selectedRankType = value;
NotifyPropertyChanged(nameof(RankTypes));
} 
}
private RankType[] _rankTypes;
public RankType[] RankTypes
{
get
{
return _rankTypes ??
(_rankTypes =Enum.GetValues(typeof(RankType)).Cast<RankType>().ToArray());
}
}

5.In 视图

<ComboBox ItemsSource="{Binding RankTypes, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" SelectedItem="{Binding SelectedRankType}" />

6.我在 xaml 中使用了列表视图

<ListView ItemsSource="{Binding EmployeesList}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="3">
<ListView.View>
<GridView>
<GridViewColumn Width="150" Header="">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=NationalId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150" Header="">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=CardId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150" Header="">
<GridViewColumn.CellTemplate>
<DataTemplate>
**<ComboBox SelectedItem="{Binding SelectedRankType}" />**
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150" Header="">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150" Header="">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=LastName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnValidationError=True,ValidatesOnDataErrors=True,ValidatesOnExceptions=True}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>

老实说,我真的不知道你的代码出了什么问题,但我可以给你一个没有任何花哨的转换器东西的工作示例:

假设您有以下窗口内容:

<Grid x:Name="grid1">
<ComboBox ItemsSource="{Binding SelectableRanks}" SelectedItem="{Binding SelectedRank}"/>
</Grid>

并在窗口构造函数中初始化数据上下文:

public MainWindow()
{
InitializeComponent();
grid1.DataContext = new RankSelectionVM();
}

这是您的视图模型:

public class RankSelectionVM
{
private RankType _SelectedRank;
public RankType SelectedRank
{
get { return _SelectedRank; }
set { _SelectedRank = value; }
}
private RankType[] _rankTypes;
public RankType[] SelectableRanks
{
get
{
return _rankTypes ??
(_rankTypes = Enum.GetValues(typeof(RankType)).Cast<RankType>().ToArray());
}
}
}
public enum RankType
{
StringValue1,
StringValue2,
StringValue3
}

它没有任何INotifyPropertyChanged或附加任何转换器,但在SelectedRanksetter 中放置一个断点 - 当您选择一个值时,它应该会中断。如果这段代码适合你,你必须找到你所做的不同之处,才能在你的项目中得到一个不起作用的代码。否则,您可能会遇到一些非常奇怪的问题,需要特别注意。

最新更新