我正在使用WPF应用程序,我正在开发一个DataGrid,它包含了必须对事件做出反应的动态内容的使用等.
我有包含DataGrid的View的以下ViewModel
public class HiddenFieldPanelViewModel
{
public List<HiddenFieldComponent> HiddenFieldList { get; set; }
public HiddenFieldComponent Component { get; set; }
public bool IsVisible { get; set; }
public enum FieldTypes{Constant,Variable}
public HiddenFieldPanelViewModel()
{
HiddenFieldList = new List<HiddenFieldComponent>();
IsVisible = false;
}
}
Run Code Online (Sandbox Code Playgroud)
此模型上适用于此示例的唯一属性是以下枚举属性
public enum FieldTypes {Constant,Variable}
Run Code Online (Sandbox Code Playgroud)
填充DataGrid时我需要做的是将枚举类型绑定到DataGrid单元格中的下拉列表,这里是添加它之后的一个DataGrid集合项的示例

例如,在上图中,我希望它具有FieldTypes枚举中的两个Enum值.
在我的XAML中,我指定了以下内容:
<DataGridTemplateColumn Header="Field Type" CanUserResize="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Height="20" SelectedIndex="0" ItemsSource="{Binding Path=FieldTypes}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Path=Value}"></Label>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
其他列正确绑定数据,但这不是.
我不确定是否有更好的方法来做到这一点.我还从IValueConverter编写了一个EnumConverter来处理字符串枚举字符串转换(如果需要的话).
谢谢
Met*_*urf 10
将枚举从ViewModel中拉出来
public enum FieldTypes
{
Constant,
Variable,
}
// Don't forget to set up your INotifyPropertyChanged on your properties
// if they are being used for binding
public class HiddenFieldPanelViewModel
{
public List<HiddenFieldComponent> HiddenFieldList { get; set; }
public HiddenFieldComponent Component { get; set; }
public bool IsVisible { get; set; }
// removed:
// public enum FieldTypes{Constant,Variable}
// will likely want to set up a property such as:
// public enum FieldTypes {get; set;}
public HiddenFieldPanelViewModel()
{
HiddenFieldList = new List<HiddenFieldComponent>();
IsVisible = false;
}
}
Run Code Online (Sandbox Code Playgroud)
这些是您导入xaml的命名空间:
xmlns:local="clr-namespace:NamespaceToYourEnum"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Run Code Online (Sandbox Code Playgroud)
然后你可以设置一个ObjectDataProvider绑定Combobox.一些示例XAML:
<Window.Resources>
<ObjectDataProvider x:Key="EnumDataProvider"
MethodName="GetValues"
ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:FieldTypes"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<!-- FieldTypesEnumProperty would be in your ViewModel -->
<ComboBox Height="25"
SelectedItem="{Binding Path=FieldTypesEnumProperty}"
ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" />
Run Code Online (Sandbox Code Playgroud)