7

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

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 を使用する場合、ターゲット要素はソースの子孫 (論理的または視覚的) である必要があります。オブジェクトはビジュアル ツリーにも論理ツリーにも表示されず、単にリソースに表示されます。そのため、オブジェクトの FindAncestor で RelativeSource を使用することはできません。

ただし、バインディングで 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 に答える
0

私がすることは、ユーザー コントロールに添付された動作 (ContextualizeResourceBehavior) を作成し、その添付された動作でリソース キーを指定することです。動作はリソースをルックアップし (アタッチ時にそれを実行できるかどうかはわかりません。そうでない場合は Loaded イベントをフックする必要があります)、データ コンテキストを転送します。

于 2010-01-15T21:18:08.163 に答える
0

リソースをビジュアル ツリーに追加すると、データ コンテキストを継承する必要があります。しかし... element spyを見てください。必要なことを実行するだけかもしれません。

于 2010-01-16T07:25:56.960 に答える
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 に答える