Привязка к Datacontext предка - PullRequest
4 голосов
/ 26 июля 2011

Было бы лучше, если бы сначала вы показали мой код, а затем задали вопрос:

<Window  DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<DataGrid ItemsSource="{Binding Printers}" >
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Drucker Typ" ItemsSource="{Binding Relative" SelectedItemBinding="{Binding PrinterType, Mode=TwoWay}"  Width="Auto" ItemsSource="{Binding}" />
</DataGrid.Columns>
</DataGrid>
</Window>

У меня есть DataGridComboBoxColumn и я хочу связать ItemsSource с DataContext окнаи SelectedItem к текущему ItemsSource объекту DataGrid.

Как это можно сделать?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 26 июля 2011

Чтобы избежать ElementName, где вы должны хорошо знать NameScope, вы также можете использовать FindAncestor. Здесь вы определяете тип родительского объекта, к которому хотите привязаться.

Пример:

<TextBlock Text=”{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Text}” />
2 голосов
/ 26 июля 2011

Использовать выражение привязки ElementName. Это позволит вам обращаться к окну по имени из выражения привязки.

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx

Использование хорошо объяснено здесь.

http://www.wpfdude.com/articles/BindingToElement.aspx

0 голосов
/ 05 января 2014

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

<Button Command="{Binding Path=DataContext.SaveCommand, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"
        CommandParameter="{Binding}">
0 голосов
/ 12 июня 2012

Мне удалось получить только эту рабочую привязку к ресурсу окна:

<DataGridComboboxColumn ItemsSource="{Binding Path=PrinterTypes, Source={StaticResource MyDataContext}}" ... />

Я не могу заставить его работать с RelativeSources, FindAncestors и т. Д.

0 голосов
/ 28 июля 2011

на данный момент я не нашел другого способа сделать это, кроме установки источника элементов во время выполнения, например:

private void SetComboBoxItemssource()
    {
        PrinterTypes = database.GetPrinterTypes();

        DataGridComboBoxColumn cmbColumn = null;

        foreach (DataGridColumn column in dtaPrinters.Columns)
        {
            if ((cmbColumn = column as DataGridComboBoxColumn) != null)
                break;
        }
        if (cmbColumn == null)
            return;

        cmbColumn.ItemsSource = PrinterTypes;
    }

, хотя он работает ..

0 голосов
/ 26 июля 2011
<local:DataBaseSettings>
    <Grid>
        <DataGrid ItemsSource="{Binding Printers}">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Drucker Typ" 
                    ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataBaseSettings}}, Path=PrinterTypes}"
                    SelectedItem="{Binding PrinterType, Mode=TwoWay}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</local:DataBaseSettings>

Обратите внимание, что если каждый Printer.PrinterType непосредственно не ссылается на элемент, который существует в DataContext вашего окна, вам нужно перезаписать метод .Equals() вашего класса PrinterType, чтобы сделать эти два элемента равными.

Что-то вроде

public override bool Equals(object obj)
{
    if (obj == null) return false;

    if (this.GetType() != obj.GetType()) return false;


    PrinterType printerType= (PrinterType)obj;

    return (this.Id == printerType.Id);
}
...