从 WPF MVVM 中的枚举列表填充 RadComboBox
Populate RadComboBox from enum list in WPF MVVM
我找到了一些主题 "How to bind a combobox from enum list",但我的问题是我尝试使用 MVVM 架构并让我的视图 (xaml) 清晰,如下所示:
部分视图 (xaml.cs):
public partial class GreenCertificatesStockForm : Erp.Core.Wpf.BaseWindow
{
private Models.GreenCertificatesGroupModel model;
public GreenCertificatesStockForm()
{
model = new Models.GreenCertificatesGroupModel();
this.DataContext = model;
InitializeComponent();
model.LoadForm(); // propose some dates for my form
model.RequestClose += () => { Close(); };
}
}
部分视图 (xaml) 我的 RadComboBox:
<telerik:RadComboBox Name="certificatesTypeRadComboBox"
Margin="5 2 0 2" Width="150"
SelectedValue="{Binding CertificatesTypeEnum , Mode=TwoWay,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnValidationError=True}"
ItemSource="{Binding }"
SelectedItem="{Binding }"
telerik:StyleManager.Theme="Office_Blue" BorderBrush="#FF707070" Background="#FFDDDDDD"
>
</telerik:RadComboBox>
所以,我的枚举列表是在我的 ViewModel (class.cs) 中创建的:
public enum CertificatesTypeEnum {
Estimat = 1,
Calculat = 2,
Facturat = 3
}
我需要在我的 RadComboBox 中显示枚举的所有值,并通过 selectedValue 将特定的选择键保存在数据库中(这带有一个参数)。如何将 ViewModel 中的值显示到 ComboBox(视图)中?
我知道可以做类似的事情:
var items = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>().Select(i => new ComboboxItem()
{ Text = Enum.GetName(typeof(gender), i), Value = (int)i}).ToArray<ComboboxItem>();
//Add the items to your combobox (given that it's called comboBox1)
RadComboBoxName.Items.AddRange(items);
但这必须在 xaml.cs 文件中进行(我不想要这个解决方案),因为在 ViewModel 中无法识别组合框,也不会找到它。
简而言之:在 xaml 文件中显示来自 ViewModel class 的枚举列表的值。
为什么不直接在视图模型中调用 Enum.GetValues
方法?这是 MVVM:
public class GreenCertificatesGroupModel
{
public IEnumerable<CertificatesTypeEnum> EnumValues
{
get
{
var list = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>();
return list;
}
}
private CertificatesTypeEnum _selectedItem;
public CertificatesTypeEnum SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value; }
}
}
XAML:
<telerik:RadComboBox ItemsSource="{Binding EnumValues}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
我找到了一些主题 "How to bind a combobox from enum list",但我的问题是我尝试使用 MVVM 架构并让我的视图 (xaml) 清晰,如下所示:
部分视图 (xaml.cs):
public partial class GreenCertificatesStockForm : Erp.Core.Wpf.BaseWindow
{
private Models.GreenCertificatesGroupModel model;
public GreenCertificatesStockForm()
{
model = new Models.GreenCertificatesGroupModel();
this.DataContext = model;
InitializeComponent();
model.LoadForm(); // propose some dates for my form
model.RequestClose += () => { Close(); };
}
}
部分视图 (xaml) 我的 RadComboBox:
<telerik:RadComboBox Name="certificatesTypeRadComboBox"
Margin="5 2 0 2" Width="150"
SelectedValue="{Binding CertificatesTypeEnum , Mode=TwoWay,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnValidationError=True}"
ItemSource="{Binding }"
SelectedItem="{Binding }"
telerik:StyleManager.Theme="Office_Blue" BorderBrush="#FF707070" Background="#FFDDDDDD"
>
</telerik:RadComboBox>
所以,我的枚举列表是在我的 ViewModel (class.cs) 中创建的:
public enum CertificatesTypeEnum {
Estimat = 1,
Calculat = 2,
Facturat = 3
}
我需要在我的 RadComboBox 中显示枚举的所有值,并通过 selectedValue 将特定的选择键保存在数据库中(这带有一个参数)。如何将 ViewModel 中的值显示到 ComboBox(视图)中?
我知道可以做类似的事情:
var items = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>().Select(i => new ComboboxItem()
{ Text = Enum.GetName(typeof(gender), i), Value = (int)i}).ToArray<ComboboxItem>();
//Add the items to your combobox (given that it's called comboBox1)
RadComboBoxName.Items.AddRange(items);
但这必须在 xaml.cs 文件中进行(我不想要这个解决方案),因为在 ViewModel 中无法识别组合框,也不会找到它。
简而言之:在 xaml 文件中显示来自 ViewModel class 的枚举列表的值。
为什么不直接在视图模型中调用 Enum.GetValues
方法?这是 MVVM:
public class GreenCertificatesGroupModel
{
public IEnumerable<CertificatesTypeEnum> EnumValues
{
get
{
var list = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>();
return list;
}
}
private CertificatesTypeEnum _selectedItem;
public CertificatesTypeEnum SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value; }
}
}
XAML:
<telerik:RadComboBox ItemsSource="{Binding EnumValues}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />