如何在TemplateSelector中获取WPF DataGrid的活动Row

时间:2011-10-31 12:54:47

标签: wpf datagrid datatemplate contentcontrol

我有一个包含三列的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的运算符进行了更新。如何恢复以前行中的值?

0 个答案:

没有答案