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

阿米尔·加拉杰达吉

我有以下场景:

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

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

1.我有一个枚举。

public enum RankType
{
   StringValue1,
   StringValue2,
   StringValue3
} 

2.我在 myclass 中有一个 enum 属性:

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

ConvertUsing Class,它为我做转换:

[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;
    }
}

EnumTypeConverter 类:

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.在视图模型中

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.在视图中

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

6.我在xaml中使用了listview

   <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>
希腊语40

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

假设您有以下窗口内容:

<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 中放置一个断点- 当您选择一个值时它应该中断。如果此代码适合您,您必须找到您所做的不同之处,才能在您的项目中获得不工作的代码。否则你可能会遇到一些非常奇怪的问题,需要特别注意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法将枚举绑定到combobox wpf mvvm

来自分类Dev

WPF MVVM中组合框的默认值

来自分类Dev

在WPF MVVM中绑定图像

来自分类Dev

MVVM WPF中的数据绑定

来自分类Dev

MVVM WPF中的数据绑定

来自分类Dev

WPF MVVM将图像控件绑定到资源中的图像

来自分类Dev

ListView中的WPF,MVVM,EventBehaviourFactory,将事件绑定到命令

来自分类Dev

WPF MVVM将图像控件绑定到资源中的图像

来自分类Dev

将组合框绑定到wpf中的List <string>

来自分类Dev

WPF MVVM组合框IsEditable =“ True”

来自分类Dev

WPF MVVM 组合框 SelectionChanged/SelectedItem

来自分类Dev

WPF MVVM:整数的组合框高度不同

来自分类Dev

WPF MVVM中的绑定多重绑定文本框

来自分类Dev

wpf中的数据绑定组合框

来自分类Dev

WPF 中的组合框数据绑定

来自分类Dev

无法使用MVVM在WPF中填写列表框

来自分类Dev

将 WPF 组合框绑定到用户设置属性

来自分类Dev

从枚举绑定的 wpf 组合框中查找所选项目

来自分类Dev

如何在WPF MVVM中使用外键绑定组合框

来自分类Dev

WPF将字典绑定到组合框

来自分类Dev

WPF MVVM:绑定到对象的属性

来自分类Dev

WPF列表框将ItemsSource与MVVM-light绑定

来自分类Dev

使用MVVM在WPF中绑定失败

来自分类Dev

MVVM中的WPF-TreeView数据绑定

来自分类Dev

WPF MVVM属性绑定无法正常工作

来自分类Dev

将ICommand绑定到TabItem WPF(MVVM)

来自分类Dev

WPF MVVM:将命令绑定到事件

来自分类Dev

将数据绑定到WPF格式MVVM

来自分类Dev

在列表框WPF中绑定组合框