DataGrid двухстороннее связывание - PullRequest
1 голос
/ 28 января 2012

У меня есть DataGrid, который показывает список типа Product.То, что я хочу сделать, это иметь вид основного / подробного вида, где сетка показывает основные данные, а затем набор текстовых полей (и т. Д.) Показывает подробный вид.Детализация в основном для больших текстовых столбцов, где их нельзя отображать в сетке из-за размера текста.Есть также некоторые элементы данных, которые отображаются как в сетке, так и в области сведений.

Кроме того, мне нужно, чтобы и сетка, и область детализации были связаны друг с другом, так что изменение одного из них приводит к обновлению базового источника данных - и если (например) сетка изменяет эти изменениянемедленно отражаются в области сведений и наоборот.

Я думаю, что этого можно достичь с помощью свойств привязки и зависимости - но как бы я это настроил?

Примечание: как пользователь можетконтролировать, какие столбцы отображаются в сетке, привязки определяются вручную в коде ..

    var column = new DataGridTextColumn()
    {
        Header = attribute.Name,
        Binding = new Binding(attribute.ColumnName) { TargetNullValue = string.Empty },
        IsReadOnly = attribute.IsReadOnly
    };

    dgProductsList.Columns.Add(column);

1 Ответ

2 голосов
/ 28 января 2012

Если вы назвали DataGrid, все, что вам нужно сделать, это связать DataContext вашей области данных с SelectedItem сетки, все привязки внутри области будут затемсвойства элемента, например

<DataGrid Name="dg" .../>
<Border DataContext="{Binding SelectedItem, ElementName=dg}">
    <StackPanel>
        <TextBox Text="{Binding SomeTextProperty, UpdateSourceTrigger=PropertyChanged}"/>
        <!-- ... -->
    </StackPanel>
</Border>

. По умолчанию это два способа, добавьте UpdateSourceTrigger=PropertyChanged для немедленного обновления свойства, в противном случае текст изменяется, когда фокус покидает TextBox.

...