Как получить активную строку таблицы данных WPF внутри TemplateSelector - PullRequest
2 голосов
/ 31 октября 2011

У меня есть WPF Datagrid с тремя столбцами. Первые два столбца DataGridComboBox Столбцы. Третий столбец - это столбец Template с ContentControl внутри. Я хочу использовать эту таблицу данных как форму ввода данных для расширенного поиска. Первый столбец будет связан со списком свойств документа в базе данных (например, DocumentName, OwnerName, DateCreated и т. Д.). Второй столбец будет список операторов (<, <=,! =). Эти операторы будут динамически изменяться в зависимости от свойства, выбранного в поле со списком в клеток [0]. Это обрабатывается в событии SelectionChanged первого comboBox. </p>

Внутри элемента управления содержимым (в ячейке [2]) мне нужно загрузить DataTempalte (каждый содержит различные элементы управления пользовательским интерфейсом, такие как autocompleteBox, DatePicker и т. Д.), Определенные в ресурсах окна на основе свойства, выбранного в comboBox в первом Колум. Я добавил пользовательский шаблонный селектор для этой цели. Но я не могу получить доступ к DataGrid ComboxBox и его содержимому первой ячейки внутри кода селектора DataTempalte.

Обратите внимание, что я не хотел связывать существующие данные с сеткой данных. Сетка данных будет использоваться в качестве формы ввода данных. Поэтому я всегда хочу сохранить значения, выбранные в предыдущих строках, только в режиме редактирования.

Пожалуйста, обратитесь к примеру кода из моего пользовательского интерфейса и код позади:

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;

После вышеуказанного изменения я теперь могу динамически назначать табличку данных для contentPresenter следующим образом в событии SelectionChanged столбца comboxBox (в первом столбце).

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 выбран в первом поле со списком, столбец оператора во второй строке должен отображаться (<, <=,>,> =). Но так как я назначаю эти операторы, используя имя comboxColumn (columnOperator), операторы в первой строке также обновлены с операторами для DateCreated. Как восстановить значения в предыдущих строках?

...