如何在 XCeed DataGridControl (WPF) 中添加 ComboBox 列
How to add ComboBox column in XCeed DataGridControl (WPF)
我正在尝试在 XCeeds DataGridControl
中添加一个组合框列。设法制作了一个 CellEditor
,它为绑定字段设置了正确的值,但是 CellContent
模板存在问题。
Xaml:
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<xcdg:DataGridControl ItemsSource="{Binding Address}" >
<xcdg:DataGridControl.Columns>
<xcdg:Column x:Name="clmAdd" FieldName="HouseNumberAdd"/>
<xcdg:Column x:Name="clmCity" FieldName="City"/>
<xcdg:Column x:Name="clmCountry" FieldName="CountryID">
<xcdg:Column.CellEditor>
<xcdg:CellEditor>
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<ComboBox SelectedValuePath="CountryID"
DisplayMemberPath="Name"
ItemsSource="{Binding Path=DataContext.Country, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
SelectedValue="{xcdg:CellEditorBinding}" IsEditable="True" Foreground="Black" IsSynchronizedWithCurrentItem="True" />
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
</xcdg:Column.CellEditor>
</xcdg:Column>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
代码:
public partial class MainWindow : Window
{
ViewMode viewMode;
public MainWindow()
{
InitializeComponent();
viewMode = new ViewMode();
this.DataContext = viewMode;
}
private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataTable source = viewMode.Address;
}
}
public class ViewMode
{
public DataTable Address { get; set; }
public DataTable Country { get; set; }
public ViewMode()
{
Address = new DataTable();
Address.Columns.Add("HouseNumberAdd", typeof(string));
Address.Columns.Add("City", typeof(string));
Address.Columns.Add("CountryID", typeof(int));
Address.Rows.Add("Ivlivensko 10-KV 1234", "Krakov", 1);
Address.Rows.Add("Astrakhanski 10-KV 1234", "Kharkiv", 2);
Address.Rows.Add("Tverskii 10-KV 1234", "Moskva", 3);
Address.Rows.Add("Klement 10-KV 1234", "Warsav", 1);
Country = new DataTable();
Country.Columns.Add("Name", typeof(string));
Country.Columns.Add("CountryID", typeof(int));
Country.Rows.Add("Poland", 1);
Country.Rows.Add("Ukrain", 2);
Country.Rows.Add("Russland", 3);
}
}
已编辑::
我已将 CellEditor 替换为 ContentTemplate,但当我尝试编辑 Grid 中的数据时,源 table 保持不变。我该如何解决这个问题?
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<xcdg:DataGridControl ItemsSource="{Binding Address}" >
<xcdg:DataGridControl.Columns>
<xcdg:Column x:Name="clmAdd" FieldName="HouseNumberAdd"/>
<xcdg:Column x:Name="clmCity" FieldName="City"/>
<xcdg:Column x:Name="clmCountry" FieldName="CountryID">
<xcdg:Column.CellContentTemplate>
<DataTemplate x:Name="clmCountryTmp">
<ComboBox SelectedValuePath="CountryID"
DisplayMemberPath="Name"
ItemsSource="{Binding Path=DataContext.Country, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
SelectedValue="{xcdg:CellEditorBinding}"/>
</DataTemplate>
</xcdg:Column.CellContentTemplate>
</xcdg:Column>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
尝试删除 IsSynchronizedWithCurrentItem="True"
在我的测试中,这会阻止文本值在进入编辑模式时出现在组合框中。我一删除它,文本就按预期显示了。
如果您想在不处于编辑模式时更改单元格的外观,您可以为该列指定自定义 CellContentTemplate
。
此外,如果您希望单元格以文本形式显示 ComboBox 的 DisplayValue,请将以下内容添加到您的列中。
<xcdg:Column.CellContentTemplate>
<DataTemplate>
<TextBlock Text="{xcdg:CellEditorBinding Converter={StaticResource YourConverter}}" />
</DataTemplate>
</xcdg:Column.CellContentTemplate>
其中 "YourConverter" 将 SelectedValuePath 值转换为 ComboBox 的 DisplayMemberPath 值。
我正在尝试在 XCeeds DataGridControl
中添加一个组合框列。设法制作了一个 CellEditor
,它为绑定字段设置了正确的值,但是 CellContent
模板存在问题。
Xaml:
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<xcdg:DataGridControl ItemsSource="{Binding Address}" >
<xcdg:DataGridControl.Columns>
<xcdg:Column x:Name="clmAdd" FieldName="HouseNumberAdd"/>
<xcdg:Column x:Name="clmCity" FieldName="City"/>
<xcdg:Column x:Name="clmCountry" FieldName="CountryID">
<xcdg:Column.CellEditor>
<xcdg:CellEditor>
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<ComboBox SelectedValuePath="CountryID"
DisplayMemberPath="Name"
ItemsSource="{Binding Path=DataContext.Country, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
SelectedValue="{xcdg:CellEditorBinding}" IsEditable="True" Foreground="Black" IsSynchronizedWithCurrentItem="True" />
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
</xcdg:Column.CellEditor>
</xcdg:Column>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
代码:
public partial class MainWindow : Window
{
ViewMode viewMode;
public MainWindow()
{
InitializeComponent();
viewMode = new ViewMode();
this.DataContext = viewMode;
}
private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataTable source = viewMode.Address;
}
}
public class ViewMode
{
public DataTable Address { get; set; }
public DataTable Country { get; set; }
public ViewMode()
{
Address = new DataTable();
Address.Columns.Add("HouseNumberAdd", typeof(string));
Address.Columns.Add("City", typeof(string));
Address.Columns.Add("CountryID", typeof(int));
Address.Rows.Add("Ivlivensko 10-KV 1234", "Krakov", 1);
Address.Rows.Add("Astrakhanski 10-KV 1234", "Kharkiv", 2);
Address.Rows.Add("Tverskii 10-KV 1234", "Moskva", 3);
Address.Rows.Add("Klement 10-KV 1234", "Warsav", 1);
Country = new DataTable();
Country.Columns.Add("Name", typeof(string));
Country.Columns.Add("CountryID", typeof(int));
Country.Rows.Add("Poland", 1);
Country.Rows.Add("Ukrain", 2);
Country.Rows.Add("Russland", 3);
}
}
已编辑::
我已将 CellEditor 替换为 ContentTemplate,但当我尝试编辑 Grid 中的数据时,源 table 保持不变。我该如何解决这个问题?
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<xcdg:DataGridControl ItemsSource="{Binding Address}" >
<xcdg:DataGridControl.Columns>
<xcdg:Column x:Name="clmAdd" FieldName="HouseNumberAdd"/>
<xcdg:Column x:Name="clmCity" FieldName="City"/>
<xcdg:Column x:Name="clmCountry" FieldName="CountryID">
<xcdg:Column.CellContentTemplate>
<DataTemplate x:Name="clmCountryTmp">
<ComboBox SelectedValuePath="CountryID"
DisplayMemberPath="Name"
ItemsSource="{Binding Path=DataContext.Country, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
SelectedValue="{xcdg:CellEditorBinding}"/>
</DataTemplate>
</xcdg:Column.CellContentTemplate>
</xcdg:Column>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
尝试删除 IsSynchronizedWithCurrentItem="True"
在我的测试中,这会阻止文本值在进入编辑模式时出现在组合框中。我一删除它,文本就按预期显示了。
如果您想在不处于编辑模式时更改单元格的外观,您可以为该列指定自定义 CellContentTemplate
。
此外,如果您希望单元格以文本形式显示 ComboBox 的 DisplayValue,请将以下内容添加到您的列中。
<xcdg:Column.CellContentTemplate>
<DataTemplate>
<TextBlock Text="{xcdg:CellEditorBinding Converter={StaticResource YourConverter}}" />
</DataTemplate>
</xcdg:Column.CellContentTemplate>
其中 "YourConverter" 将 SelectedValuePath 值转换为 ComboBox 的 DisplayMemberPath 值。