我正在使用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;
}
}
此模型上适用于此示例的唯一属性是以下枚举属性
public enum FieldTypes {Constant,Variable}
填充DataGrid时我需要做的是将枚举类型绑定到DataGrid单元格中的下拉列表,这里是添加它之后的一个DataGrid集合项的示例
例如,在上图中,我希望它具有两个枚举值 来自FieldTypes枚举。
在我的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>
其他列正确绑定数据,但这不是。
我不确定是否有更好的方法去做。我还从IValueConverter编写了一个EnumConverter来处理字符串枚举字符串转换,如果需要的话。
由于
答案 0 :(得分:10)
将enum拉出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;
}
}
这些是您导入xaml的名称空间:
xmlns:local="clr-namespace:NamespaceToYourEnum"
xmlns:System="clr-namespace:System;assembly=mscorlib"
然后你可以设置一个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}}" />
答案 1 :(得分:1)
看一下像:
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=EstimateStatusValueId}"
ItemsSource="{Binding Path=DataContext.EstimateStatusValueList,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Description"
SelectedValuePath="EstimateStatusValueId" />
</DataTemplate>
答案 2 :(得分:0)
对于仍在寻找答案的人:
在 .net 4.5 中,您只需要具有枚举类型的属性。 DataGrid会自动为您创建组合框
像这样:
public enum FieldTypes
{
Constant,
Variable,
}
public class HiddenFieldPanelViewModel
{
public FieldTypes Types { get; set; }
}