【发布时间】:2010-10-23 22:01:44
【问题描述】:
我有一个DataGrid,在我的基于 WPF 4 桌面的应用程序中包含数据。
当用户在行DataGrid 上单击两次时,将切换到编辑模式,用户可以在其中更改单元格的值。现在我希望在特定单元格上,用户只能从组合框中选择值,例如性别 - 男性/女性,不要输入其他内容。
如何在DataGrid的编辑模式下显示组合框?
【问题讨论】:
我有一个DataGrid,在我的基于 WPF 4 桌面的应用程序中包含数据。
当用户在行DataGrid 上单击两次时,将切换到编辑模式,用户可以在其中更改单元格的值。现在我希望在特定单元格上,用户只能从组合框中选择值,例如性别 - 男性/女性,不要输入其他内容。
如何在DataGrid的编辑模式下显示组合框?
【问题讨论】:
实际上有很多不同的方法,
绑定到枚举
public enum ChoiseEnum
{
Yes,
No,
Maybe
}
首先你需要一个 ObjectDataProvider
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<ObjectDataProvider MethodName="GetValues"
ObjectType="{x:Type sys:Enum}"
x:Key="ChoiseEnumDataProvider">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:ChoiseEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
然后我们可以像这样将 DataGridComboBoxColumn 绑定到一个名为 Choise 的属性
<DataGrid Name="c_dataGrid"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Choise"
SelectedItemBinding="{Binding Choise}"
ItemsSource="{Binding Source={StaticResource ChoiseEnumDataProvider}}"/>
</DataGrid.Columns>
</DataGrid>
仅在组合框中显示静态列表中的值
更新
添加了更多细节
namespace ComboBoxDataGrid
{
public class TestClass
{
static TestClass()
{
ChoiseData = new List<string>();
ChoiseData.Add("Yes");
ChoiseData.Add("No");
ChoiseData.Add("Maybe");
}
public static List<string> ChoiseData
{
get;
set;
}
public TestClass()
{
SelectedChoise = string.Empty;
}
public TestClass(string selectedChoise)
{
SelectedChoise = selectedChoise;
}
public string SelectedChoise
{
get;
set;
}
}
}
public partial class WinWorkers: Window
{
public WinWorkers()
{
InitializeComponent();
TestClasses = new ObservableCollection<TestClass>();
TestClasses.Add(new TestClass("Yes1"));
TestClasses.Add(new TestClass("No"));
TestClasses.Add(new TestClass("Maybe"));
c_dataGrid.ItemsSource = TestClasses;
}
public ObservableCollection<TestClass> TestClasses
{
get;
set;
}
}
<Window x:Class="ComboBoxDataGrid.WinWorkers"
xmlns:local="clr-namespace:ComboBoxDataGrid"
...>
<Window.Resources>
<local:TestClass x:Key="TestClass" />
</Window.Resources>
<Grid>
<DataGrid Name="c_dataGrid"
AutoGenerateColumns="False"
RowHeaderWidth="100">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Choise_StaticList"
SelectedValueBinding="{Binding SelectedChoise}"
ItemsSource="{Binding Source={StaticResource TestClass}, Path=ChoiseData}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
【讨论】: