1

DependencyProperty を持つコントロールの DataContext に ViewModel があるとします。

AControl.cs:

class AControl : Control /* could be another class e.g. Viewbox, Label */
{
    public AControl()
    {
        DataContext = new AControlViewModel(/* this ?? */);
    }


    public int AProperty
    {
        get { return (int)GetValue(APropertyProperty); }
        set { SetValue(APropertyProperty, value); }
    }

    public static readonly DependencyProperty APropertyProperty =
        DependencyProperty.Register("AProperty", typeof(int), 
        typeof(AClass), new FrameworkPropertyMetadata(0));
}

AControlViewModel.cs:

class AControlViewModel : ViewModelBase
{
    void SomeMethod()
    {
        // Some actions accessing AProperty for the Control 
        // in whose DataContext 'this' is in
    }

    // EDIT: Property added
    private int vMProperty;
    public int VMProperty 
    {
        get { return vMProperty; }
        set
        {
             if (vMProperty == value)
                 return;

             vMProperty = value;
             OnPropertyChanged("VMProperty"); // In ViewModelBase
        } 
    } 
}

コントロールから this-reference を渡すことは可能ですが、コードビハインドからのみ可能です。これを正しく行う方法 (参照を渡すよりも簡単な方法がある場合) とXaml から行う方法は? また、AProperty の値が変更された場合に通知を受け取る方法は?

編集: 別のコントロールのスタイルで:

<Style TargetType="{x:Type namespace:AnotherControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type namespace:AnotherControl}"> 
                <Border>
                    <namespace:AControl AProperty="{TemplateBinding AnotherProperty}">
                        <!-- This Binding replaces the Binding 'AProperty="{Binding VMProperty}' inside AControl. 
                             I think I have to bind to VMProperty instead of AProperty... but how?-->
                    </namespace:AControl> 
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style> 
4

1 に答える 1

2

プロパティ (INotifyPropertyChanged 実装を含む) を ViewModel に追加し、それをビューのプロパティにバインドします。

それでおしまい。

これで、ビューでプロパティの値にアクセスできます。

ViewModel で View への参照を取得しようとしないでください。MVVM パターンが壊れてしまいます。

于 2013-07-26T19:44:08.293 に答える