7

我怎样才能UserControl从它的内部绑定到它的属性ResourceDictionary?我希望我在资源中声明的对象DataContextUserControl它包含的对象相同:

<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')

4

6 回答 6

2

我的解决方法是DataContext在代码隐藏中设置资源的。

.xaml

<local:SomeType x:Key="SomeKey" SomeProperty="{Binding ... }" />

.xaml.cs

public SomeControl()
{
    InitializeComponent();
    ((SomeType)this.Resources["SomeKey"]).DataContext = this;
}
于 2010-09-29T15:18:26.777 回答
1

使用 FindAncestor 时,目标元素需要是源的后代(逻辑或视觉)。您的对象不会出现在视觉树或逻辑树中,它只是在资源中。因此,您不能将 RelativeSource 与 FindAncestor 一起用于您的对象。

不过,您可以在 Binding 中使用 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>
于 2010-02-05T13:00:27.850 回答
1

设置x:Shared ="False",这将在每次使用时克隆资源并使其成为元素的子元素,从而启用绑定。

<local:SomeClass
            x:Key="SomeClass"
            x:Shared="False"
            DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
于 2013-02-14T15:21:43.250 回答
0

我认为您正在寻找的只是绑定到继承的 DataContext 的 {Binding}。这是一个示例,虽然有点奇怪,但它显示了如何通过绑定到 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>
于 2010-01-15T20:32:52.357 回答
0

我要做的是在用户控件上创建附加行为(ContextualizeResourceBehavior),并在该附加行为上指定资源键。该行为将查找资源(不确定您是否能够在附加时执行此操作,否则您需要连接 Loaded 事件)并传输数据上下文。

于 2010-01-15T21:18:08.163 回答
0

当您将资源添加到可视化树时,它应该继承数据上下文。但是......看看元素间谍它可能只是做你需要的。

于 2010-01-16T07:25:56.960 回答