加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将ComboBox的SelectedValue绑定到WPF中的枚举

发布时间:2020-12-16 01:50:11 所属栏目:百科 来源:网络整理
导读:我想在ListView中显示产品列表,其中一列是我想要绑定的ComboBox.这是我的枚举: public enum SelectionMode { One,Two } 和产品类: public class Product{ public SelectionMode Mode { get; set; } public string Name { get; set; }} 在ViewModel类中,我
我想在ListView中显示产品列表,其中一列是我想要绑定的ComboBox.这是我的枚举:

public enum SelectionMode { One,Two }

和产品类:

public class Product
{
    public SelectionMode Mode { get; set; }

    public string Name { get; set; }
}

在ViewModel类中,我有一个Product的ObservableCollection:

private ObservableCollection<Product> _productList;
    public ObservableCollection<Product> ProductList
    {
        get
        {
            return _productList;
        }
        set
        {
            _productList = value;
        }
    }

    public MainViewModel()
    {
        ProductList = new ObservableCollection<Product>
                          {
                              new Product {Mode = SelectionMode.One,Name = "One"},new Product {Mode = SelectionMode.One,new Product {Mode = SelectionMode.Two,Name = "Two"}
                          };
    }

最后我有一个带有ListView的Grid,它绑定到我的ProductList:

<Window.Resources>
    <ObjectDataProvider x:Key="AlignmentValues" 
                    MethodName="GetNames" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="ViewModel:SelectionMode" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

<Grid>
    <ListView Height="120" HorizontalAlignment="Left" 
                  VerticalAlignment="Top"
                  SelectionMode="Multiple" 
                  ItemsSource="{Binding ProductList}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="120" Header="Product Name" DisplayMemberBinding="{Binding Path=Name}" />
                <GridViewColumn Header="Selection Mode">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Source={StaticResource AlignmentValues}}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

我的问题是;将ComboBox的SelectedValue绑定到Product类的SelectionMode属性的方法是什么?

更新

好.我在this topic找到了答案.所以我必须添加转换器类:

public class MyEnumToStringConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
    {
        return value.ToString();
    }

    public object ConvertBack(object value,System.Globalization.CultureInfo culture)
    {
        return (SelectionMode)Enum.Parse(typeof(SelectionMode),value.ToString(),true);
    }
}

并将其添加到窗口资源:

<Window.Resources>
    <ObjectDataProvider x:Key="AlignmentValues" 
                    MethodName="GetNames" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="ViewModel:SelectionMode" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <Converters:MyEnumToStringConverter x:Key="MyEnumConverter"/>
</Window.Resources>

最后编辑ComboBox数据模板:

<ComboBox ItemsSource="{Binding Source={StaticResource AlignmentValues}}" 
                                      SelectedValue="{Binding Path=Mode,Converter={StaticResource MyEnumConverter}}"/>

就这样.
希望它对别人有用:)

解决方法

如果您准备更改ComboBox的ItemsSource的绑定,那么,只需SelectedValue =“{Binding Mode,UpdateSourceTrigger = PropertyChanged,Mode = TwoWay}”将起作用.

在这种情况下,您必须像这样绑定ItemsSource:ItemsSource =“{Binding RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type ViewClass}},Path = ModeList}”;其中,ModeList是SelectionMode类型列表的简单公共属性,包含应该在ComboBox下拉列表中显示的枚举,而ViewClass是此属性(ModeList)可用的类;确保在xaml中添加了名称空间的引用.

否则你必须使用转换器,它应该将字符串转换回枚举类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读