У меня есть 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. Как восстановить значения в предыдущих строках?