我有一个包含三列的WPF Datagrid。前两列DataGridComboBox Columns。第三列是ContentControl里面的Template列。我想将此Datagrid用作高级搜索的数据输入表单。第一列将与数据库中文档的属性列表绑定(如DocumentName,OwnerName,DateCreated等)。第二列将是运算符列表(<,< =,!=)。这些运算符将根据从组合框中选择的属性动态更改 细胞[0]。这是在第一个comboBox的SelectionChanged事件中处理的。
在内容控件中(在单元格[2]中),我需要加载一个DataTempalte(每个包含不同的UI控件,如autocompleteBox,DatePicker等),这些控件是根据第一个在comboBox中选择的属性在窗口的Resources中定义的。科拉姆。为此,我添加了一个自定义模板选择器。但我无法访问DataGrid ComboxBox及其在DataTempalte选择器代码中的第一个单元格的内容。
请注意,我不想将现有数据绑定到数据网格。 datagrid将用作数据输入表单。因此,我始终只想在编辑模式下保留前一行中选择的值。
请参考我的用户界面和代码中的示例代码:
public class DocumentSearchProperty
{
public string PropertyName { get; set; }
public string Operator { get; set; }
public string PropertyValue { get; set; }
}
这是我设置为我的数据源的项目源的类。
<DataGrid AutoGenerateColumns="False" Width="Auto" Name="documentPropertyGrid"
ItemsSource="{}"
SelectionMode="Single" CanUserAddRows="True" CanUserDeleteRows="True" CanUserResizeColumns="True" CanUserSortColumns="True"
CanUserResizeRows="False" FrozenColumnCount="0" HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" RowHeaderWidth="0"
AlternatingRowBackground="Gainsboro" AlternationCount="2" VerticalContentAlignment="Stretch" VerticalAlignment="Top" VerticalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="columnProperty" ItemsSource="{}" SelectedItemBinding="{Binding Path=Id}"
Header="Property" Width="170"/>
<DataGridComboBoxColumn x:Name="columnOperator" ItemsSource="{}" SelectedItemBinding="{Binding Path=value}" Header="Operator" Width="170" />
<DataGridTemplateColumn x:Name="PropertyValue" Header="Value" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl x:Name="CntControl">
<ContentControl.Content>1</ContentControl.Content>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
以下代码用于处理第一个comboBox的选择更改事件。在这个选择改变了事件中,我可以在单元格中获得ComboBox [1]。但我无法在单元格中获取ContentControl [2]。任何人都可以建议一个更好的方法来实现这个目标吗?
DataGridRow row = this.documentPropertyGrid.ItemContainerGenerator.ContainerFromIndex(this.documentPropertyGrid.SelectedIndex) as DataGridRow;
ComboBox ele = this.documentPropertyGrid.Columns[0].GetCellContent(row) as ComboBox;
ContentControl contentControl = this.documentPropertyGrid.Columns[2].GetCellContent(row) as ContentControl;
我已将网格的第三列作为内容演示者进行了以下更改:
ContentPresenter contentPresenter = this.documentPropertyGrid.Columns[2].GetCellContent(row) as ContentPresenter;
在上述更改之后,我现在可以在comboxBox列的SelectionChanged事件中(在第一列中)动态地将一个datatemplate分配给contentPresenter。
DataTemplate dt = new DataTemplate();
switch (propertyName)
{
case "DocumentName":
dt = this.FindResource("AutoCompleteBoxTemplate") as DataTemplate;
break;
case "DateCreated":
case "DateModified":
case "DateAccessed":
dt = this.FindResource("DatePickerTemplate") as DataTemplate;
break;
default:
dt = this.FindResource("AutoCompleteBoxTemplate") as DataTemplate;
break;
}
contentPresenter.ContentTemplate = dt;
但现在在第二列中,我设置的运算符值将替换为所有行中的最新运算符。对于e-g如果在第一个组合框中选择的属性是TemplateName,则会有一个包含两个运算符的列表(Equal,NotEqual)。但是当在第一个组合框中选择DateCreated时,第二行中的操作符列应显示(&lt;,&lt; =,&gt;,&gt; =)。但由于我使用comboxColumn(columnOperator)的名称来分配这些运算符,因此第一行中的运算符也使用DateCreated的运算符进行了更新。如何恢复以前行中的值?