ComboBox绑定到SelectedValue不起作用

时间:2016-06-17 06:46:50

标签: c# wpf combobox enums

我需要将ComboBox绑定到枚举值,并遵循以下几个想法。我最终得到了我能找到的最简单的解决方案,它应该满足我的所有需求,除非它没有完全正常工作,但它应该...

继承人我在做什么: 我需要DataGrid单元格中的ComboBox,所以我为它定义了一个DataGridTemplateColumn

<DataGridTemplateColumn MinWidth="150" Header="Data-Type">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox SelectedValue="{Binding SelectedDataType,Mode=TwoWay}" ItemsSource="{Binding DataTypeValues}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

在我的ViewModel中,我填充了枚举值

public IEnumerable<MyType> DataTypeValues
{
    get
    {
        return Enum.GetValues(typeof(MyType)).Cast<MyType>().ToList<MyType>();
    }
}

并拥有所选值的属性

MyType _selectedType;
public MyType SelectedDataType
{
    get { return _selectedType; }
    set
    {
        _selectedType = value;
        OnPropertyChanged();
    }
}

ComboBox按照我的预期填充了我的枚举值,但是当我选择另一个值时,不调用SelectedDataType的setter,这意味着我没有关于当前选择哪个Item的信息。我也尝试使用SelectedItem绑定而不是SelectedValue,但这也不起作用。

我在这里缺少什么?

编辑:拼写错误

EDIT2: -------- -------- UPDATE

现在我创建了一个示例WPF应用程序来重现我的问题。只使用那里的相关代码部分,并且存在同样的问题。下面是该示例的完整源代码:

Xaml文件:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication2"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid ItemsSource="{Binding Parameters}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedParameter, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTemplateColumn MinWidth="150" Header="Data-Type">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding DataTypeValues}" SelectedItem="{Binding SelectedType, Mode=TwoWay}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

和.cs文件:

namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var vm = new Viewmodel();
        DataContext = vm;
    }
}

class Viewmodel : ViewModelBase
{
    public Viewmodel()
    {
        Parameters = new ObservableCollection<Parameter>();
        Parameters.Add(new Parameter());
    }

    public ObservableCollection<Parameter> Parameters
    {
        get; private set;
    }

    public Parameter SelectedParameter { get; set; }
}

class Parameter : ViewModelBase
{
    MyType _selectedType;
    public MyType SelectedType
    {
        get { return _selectedType; }
        set
        {
            _selectedType = value;
            OnPropertyChanged();
        }
    }

    public IEnumerable<MyType> DataTypeValues
    {
        get { return Enum.GetValues(typeof(MyType)).Cast<MyType>(); }
    }
}

public enum MyType
{
    INT,
    DOUBLE,
    REAL,
    STRING
}

public class ViewModelBase : INotifyPropertyChanged
{
    protected virtual void OnPropertyChanged(bool validateFields = true, [CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
}

3 个答案:

答案 0 :(得分:0)

**编辑:**

是的,我现在遇到了这个问题。您的代码无效,因为绑定SelectedValue

而是绑定SelectedItem属性并检查。它应该工作。

<DataGridTemplateColumn MinWidth="150" Header="Data-Type">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox SelectedItem="{Binding SelectedDataType,Mode=TwoWay}" ItemsSource="{Binding DataTypeValues}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

答案 1 :(得分:0)

我认为你绑定窗口视图模型中的选定项目,在数据网格内部进行绑定。下面的代码对我有用。

XAML:

 <DataGrid Name="datagrid" ItemsSource="{Binding List,Mode=TwoWay}"   >
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Status" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Height="22" 
                                     ItemsSource="{Binding DataContext.DataTypeValues,RelativeSource={RelativeSource AncestorType=Window,
                                                                                        AncestorLevel=1}}"
                                      SelectedItem="{Binding SelectedDataType,UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>               

                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

视图模型:

 private List<ListItems> list;

        public List<ListItems> List
        {
            get { return list; }
            set
            {
                list = value;
                this.NotifyPropertyChanged("List");
            }
        }

        public IEnumerable<MyType> DataTypeValues
        {
            get
            {
                return Enum.GetValues(typeof(MyType)).Cast<MyType>().ToList<MyType>();
            }
        }

        public ViewModel()
        {
            List = new List<ListItems>();
            List.Add(new ListItems());
            List.Add(new ListItems());

        }

网格项目:

public class ListItems 
    {

        MyType _selectedType;
        public MyType SelectedDataType
        {
            get { return _selectedType; }
            set
            {
                _selectedType = value;
                this.NotifyPropertyChanged("SelectedDataType");
            }
        }
    }

答案 2 :(得分:0)

您应该在绑定到selectedvalue属性时使用元素名称,或者像

那样使用selectedItem
 <DataTemplate>
                        <ComboBox Height="22" 
                                 ItemsSource="{Binding DataContext.DataTypeValues,RelativeSource={RelativeSource AncestorType=Window,
                                                                                    AncestorLevel=1}}"
                                  SelectedItem="{Binding SelectedDataType,ElementName="datagrid",UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>