Привязка к предкам из ResourceDictionary

Как я могу связать с a UserControlсвойство из ResourceDictionary? Я хочу объект, который я объявляю в своих ресурсах, чтобы иметь то же DataContext как UserControl это содержится в:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Some.Namespace"
    DataContext="{Binding Path=ViewModel, RelativeSource={RelativeSource Self}}">
    <UserControl.Resources>
        <local:SomeClass
            x:Key="SomeClass"
            DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
    </UserControl.Resources>
</UserControl>

Во времени выполнения я получаю ошибку:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='UserControl', AncestorLevel='1''. BindingExpression:Path=DataContext; DataItem=null; target element is 'SomeClass' (Name=''); target property is 'DataContext' (type 'Object')

7
задан M. Dudley 15 January 2010 в 21:13
поделиться

4 ответа

Я думаю, что вы ищете, это просто {Binding}, который связывается с унаследованным DataContext. Вот пример, хотя немного странно показывает, как вы можете получить цвет через привязку к DataContext:

<Window x:Class="AncestorBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <SolidColorBrush x:Key="MyBrush" Color="Blue" />
    </Window.Resources>
    <StackPanel>
        <Button DataContext="{Binding Source={StaticResource MyBrush}}" Content="My Button">
            <Button.Resources>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Background" Value="{Binding}" />
                </Style>
            </Button.Resources>
        </Button>
    </StackPanel>
</Window>
0
ответ дан 7 December 2019 в 14:33
поделиться

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

0
ответ дан 7 December 2019 в 14:33
поделиться

Когда вы добавляете ресурс в визуальное дерево, он должен наследовать контекст данных. Но ... посмотрите на элемент Spy Это может просто сделать то, что вам нужно.

0
ответ дан 7 December 2019 в 14:33
поделиться

При использовании FindAncestor целевой элемент должен быть потомком (логическим или визуальным) источника. Ваш объект не отображается ни в визуальном, ни в логическом дереве, он просто в ресурсах. Таким образом, вы не можете использовать RelativeSource с FindAncestor для своего объекта.

Вы можете использовать ElementName в своей привязке. Примерно так должно работать:

<UserControl x:Name="userControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Some.Namespace"
    DataContext="{Binding Path=ViewModel, RelativeSource={RelativeSource Self}}">
    <UserControl.Resources>
        <local:SomeClass
            x:Key="SomeClass"
            DataContext="{Binding Path=DataContext, ElementName=userControl}" />
    </UserControl.Resources>
</UserControl>
1
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: