Привязать к родителю / родственнику текущего свойства datacontext / source в WPF - PullRequest
6 голосов
/ 23 апреля 2011

Как мы привязываемся к родителю / брату текущего текстового контекста данных (т. Е. Свойству источника, представляющему текущий текстовый текст данных)?

Я не говорю о привязке к свойству родительского элемента управления (в этом случае используется родительский объект цели, а не источника) - и это легко сделать с помощью RelativeSourceMode = FindAncestor.

RelativeSourceMode = PreviousData обеспечивает ограниченную поддержку привязки к предыдущему брату элемента данных, но не к родительскому или другому брату.

Пустой пример:
(предположим, что INPC на месте)
Как связать ItemsSource ComboBox со свойством Departments в ViewModel?

public class Person
{
    public string Name { get; set; }
    public string Department { get; set; }
}

public class PersonViewModel
{
    public List<Person> Persons { get; set; }
    public List<string> Departments { get; set; }

    public PersonViewModel()
    {
        Departments = new List<string>();
        Departments.Add("Finance");
        Departments.Add("HR");
        Departments.Add("Marketing");
        Departments.Add("Operations");

        Persons = new List<Person>();
        Persons.Add(new Person() { Name = "First", Department = "HR" });
        Persons.Add(new Person() { Name = "Second", Department = "Marketing" });
        Persons.Add(new Person() { Name = "Third", Department = "Marketing" });
    }
}

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <DataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Departments???}"
                                      SelectedValue="{Binding Department}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Ответы [ 3 ]

11 голосов
/ 23 апреля 2011

вы можете получить доступ к предку DataContext следующим образом:

<ComboBox ItemsSource="{Binding DataContext.Departments, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"
                                  SelectedValue="{Binding Department}"/>
3 голосов
/ 23 апреля 2011

В большинстве случаев я использую DataContext в качестве корневого пути:

{Binding Path=DataContext.MyProperty,ElementName=MyElement}
{Binding Path=DataContext.MyProperty,RelativeSource={RelativeSource AncestorType=MyAnsectorTypr}
0 голосов
/ 23 апреля 2011

Я не уверен, почему подход RelativeSource не работает.(Я делаю это все время, AncestorType=UserControl). Но если это неприемлемо, на ум приходят два способа.

1) Дайте каждому человеку список департаментов, к которым можно привязаться.В вашем примере вы можете просто передать список в конструкторе Person.Или, дайте каждому Person ссылку на родителя, чтобы получить доступ к любому свойству родителя, например: {Binding Parent.Departments}

2) Создайте вложенное свойство "ParentDataContext" и установите его вне вашего элемента управления, напримерthis:

<Window local:Attached.ParentDataContext="{Binding}" ... >

Затем вы можете привязать к нему любое место в дереве ниже:

{Binding Path=(local:Attached.ParentDataContext).Departments, RelativeSource=Self}

Присоединенное свойство должно наследовать, поэтому все нижнее значение в дереве будет установлено в соответствии с настройкойэто на верхнем уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...