我需要将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;
}
}
答案 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>