0

UserControlを使用して、子の依存関係プロパティをStyleホスト要素のビューモデルのプロパティにバインドする方法は?

以下のコードを試してみましたが、 を介してMyBlock.BlockIsOnlyOneビューモデルのプロパティ - にバインドする必要があります。しかし、何らかの理由で機能しません -の値は変更されませんが、変更されます...MyContainerViewModel.ViewModelIsOnlyOneStyleSetterMyBlock.BlockIsOnlyOneMyContainerViewModel.ViewModelIsOnlyOne

コンテナー XAML:

<UserControl x:Class="MyNs.MyContainer"
             ...
             >
    <UserControl.DataContext>
        <vc:MyContainerViewModel x:Name="TheDataContext"/>
    </UserControl.DataContext>

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type vc:MyBlock}">
                <Setter Property="BlockIsOnlyOne" Value="{Binding ViewModelIsOnlyOne}"/>
                <!-- Tried this too, with no success: -->
                <!-- <Setter Property="BlockIsOnlyOne" Value="{Binding ViewModelIsOnlyOne, ElementName=TheDataContext}"/> -->
            </Style>
        </Grid.Resources>
        ...
        <vc:MyBlock DataContext="{Binding PortA[0]}" />
    </Grid>
</UserControl>

コンテナのViewModel(重要な部分のみ...):

[NotifyPropertyChangedAspect] // handles the INotifyPropertyChanged implementation...
class MyContainerViewModel{
    ...
    public bool ViewModelIsOnlyOne { get; private set; }
    ...
}

MyBlock UserControl:_

class MyBlock : UserControl{
    ...
    public static readonly DependencyProperty BlockIsOnlyOneProperty = DependencyProperty.Register(
        "BlockIsOnlyOne", typeof (bool), typeof (MyBlock), 
        new PropertyMetadata(default(bool), BlockIsOnlyOne_PropertyChangedCallback));

    private static void BlockIsOnlyOne_PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs a)
    {
        var @this = dependencyObject as MyBlock;
        if (@this == null) return;
        Trace.WriteLine(string.Format("Old: {0}, New: {1}", a.OldValue, a.NewValue)); // never seems to fire...
    }

    public bool BlockIsOnlyOne
    {
        get { return (bool) GetValue(BlockIsOnlyOneProperty); }
        set { SetValue(BlockIsOnlyOneProperty, value); }
    }
    ...
}
4

1 に答える 1

2

UserControlを使用して、ビュー モデル プロパティにアクセスできるはずですRelativeSource Binding。アイデアは、ビューモデルがプロパティを使用して設定されている親ビューを検索することです...これを試してください:DataContextAncestorType

<Style TargetType="{x:Type vc:MyBlock}">
    <Setter Property="DataContext.BlockIsOnlyOne" Value="{Binding ViewModelIsOnlyOne, 
    RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</Style>

UserControl.DataContext代わりに子を取得する場合は、RelativeSource.AncestorLevelプロパティUserControlを適切なレベルに設定するか、代わりに親の名前/タイプを使用できます。

<Style TargetType="{x:Type vc:MyBlock}">
    <Setter Property="BlockIsOnlyOne" Value="{Binding DataContext.ViewModelIsOnlyOne, 
    RelativeSource={RelativeSource AncestorType={x:Type YourPrefix:MyContainer}}}" />
</Style>
于 2014-12-16T14:12:41.560 に答える