2017-08-18 18 views
0

私は、Button.xamlで定義されている2つのボタンを含むView MainWindow.xamlを持っています。ボタンは、ボタンが表示されるかどうかを定義するプロパティIsVisibleにバインドされます。UserControlに渡された継承ViewModelが子として扱われますViewModel

MainWindow.xaml:

<local:Button DataContext="{Binding ButtonViewModel1}" /> 
<local:Button DataContext="{Binding ButtonViewModel2}" /> 

Button.xaml:ButtonViewModelButtonViewModelChild:私は2つのviewmodelsを持っているボタンの

<StackPanel> 
    <Button Name="MyButton" Visibility="{Binding IsVisible}"> 
     <TextBlock>My Button</TextBlock> 
    </Button> 
</StackPanel> 

ButtonViewModelChildButtonViewModelから継承します。どちらも、IsVisibleプロパティを提供します。

ButtonViewModel:

public Visibility IsVisible 
{ 
    get 
    { 
     return Visibility.Hidden; 
    } 
} 

をButtonViewModelChild:

public new Visibility IsVisible 
{ 
    get 
    { 
     return Visibility.Visible; 
    } 
} 

MainWindow.xamlのViewModelには、プロパティButtonViewModel1ButtonViewModel2が含まれています。これらのプロパティは、次のようになります。ButtonViewModelChildが使用されている場合ButtonViewModelはボタンののDataContextとして使用し、表示されている場合は

public ButtonViewModel ButtonViewModel1 
{ 
    get 
    { 
     return new ButtonViewModelChild(); 
    } 
} 

public ButtonViewModelChildButtonViewModel2 
{ 
    get 
    { 
     return new ButtonViewModelChild(); 
    } 
} 

ボタンが不可視にする必要があります。

ButtonViewModel1をDataContextとして使用するボタンはButtonViewModelとなり、もう1つのボタンはButtonViewModelChildになるとします。したがって、最初のボタンは表示されず、2番目のボタンが表示されます。どちらのボタンも表示されます。 WPFは何をしていますか?明らかに、インスタンスの継承ビューを両方とも使用します。作成されたインスタンス型ではなく、プロパティの戻り値の型を使用するようにWPFに指示する方法はありますか?

私は、メソッド隠蔽はベストプラクティスではないことを認識しています。私はおそらくデザインを変更するだろうが、なぜ結果が期待通りでないのか不思議です。

+0

ありがとうございました。両方のボタンは表示されません。しかし、彼らは両方です。 – telandor

答えて

1

バインディングパスのプロパティはリフレクションによって解決されるため、ButtonViewModel1プロパティタイプに関係なく、サブクラスプロパティが検出されます。あなたがゲッターからButtonViewModelインスタンスを返すしなければならない、ということを避けるために

public ButtonViewModel ButtonViewModel1 
{ 
    get { return new ButtonViewModelChild(); } // subclass instance 
} 

public ButtonViewModel ButtonViewModel1 
{ 
    get { return new ButtonViewModel(); } 
} 

あなたにもobjectとしてプロパティを宣言することができ、結合はまだ動作します:

public object ButtonViewModel1 
{ 
    get { return new ButtonViewModelChild(); } 
} 

さらに、一般に、UserControlに特定のビューモデル(したがって、それをビールモデルクラスに依存させる)。代わりに、ユーザーコントロールクラスでIsButtonVisible依存関係プロパティを宣言し、それはこのようにバインドするバインドする必要があります

<StackPanel> 
    <Button Visibility="{Binding IsButtonVisible, 
         RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <TextBlock>My Button</TextBlock> 
    </Button> 
</StackPanel> 

使い方は次のようになります。

<local:Button IsButtonVisible="{Binding ButtonViewModel1.IsVisible}" /> 
0

私は問題をあなたのゲッターで型エラーを考えて、ButtonViewModelChildの代わりにButtonViewModelをButtonViewModel1から返すと、ButtonViewModelChildが返されます。

+1

OPは両方のプロパティがサブクラスのインスタンスを返すという事実を十分に認識していることを考慮する必要があります。彼らは、ButtonViewModel1プロパティの戻り値の型がどうにか重要であるという印象を受けています。 – Clemens

関連する問題