2011-01-17 17 views
3

私はWPFとMVVMパターンで作業していますが、DataContext(viewmodel)のプロパティに応じて1つまたは複数のボタンを表示する必要があるボタンからなる単純なビューがあります。 データ・トリガとデータ・テンプレートを使ってこの作業を試みましたが、何らかの理由でバインディングが評価されていない(または何か間違っています) DataContext設定に基づくWPFボタンの内容

<Button x:Class="EpicNavalBattle.View.PositionView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     > 
    <Button.Resources> 
     <DataTemplate x:Key="Hidden"> 
      <Label Content="Hidden"></Label> 
     </DataTemplate> 
     <DataTemplate x:Key="Shown"> 
      <Label Content="{Binding Path=Content.ContentName}" /> 
     </DataTemplate> 



    </Button.Resources> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Revealed}" Value="False"> 
        <Setter Property="ContentTemplate" Value="{DynamicResource Hidden}"></Setter> 

       </DataTrigger> 
       <DataTrigger Binding="{Binding Revealed}" Value="True"> 
        <Setter Property="ContentTemplate" Value="{DynamicResource Shown}"></Setter> 

       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

    </Button.Style> 


</Button> 

ただ混乱を避けるために:コンテンツがbasiclyモデルクラスのViewModelに(継承のDataContext)、およびContentName、Modelクラスのプロパティのプロパティです。 これを証明するために、私はデータ用にContent = "Binding ...."を変更したので、実際には指定されたラベルが付いたボタンを表示しているため、データ型全体が評価されています。 今のところ、テキストが表示されていないボタン(最小サイズ、最小サイズ) 何か助けていただければ幸いです(この問題を解決する方法だけでなく、私がここで間違っていることも)。ありがとう!

答えて

4

私はあなたのコードのサンプルをテストし、問題はこれです:ボタンなど

ContentControlsは、DataTemplateためDataContextとしてその内容を設定します。したがって、DataContextにバインドすると、実際にはボタンのコンテンツにバインドされます。この最後のソリューションはまた、あなたので、ところで隠しと容易になるだろう

<Setter Property="Content" Value="{Binding Content.ContentName}"></Setter> 

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=DataContext.Content.ContentName} 

またはあなたのトリガのコンテンツとしての価値を設定します。

次の2つの方法でそれを解決することができますこれらのテンプレートを捨てることができます:

  <Button.Style> 
       <Style TargetType="{x:Type Button}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Revealed}" Value="True"> 
           <Setter Property="Content" Value="{Binding Content.ContentName}"></Setter> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Revealed}" Value="False"> 
           <Setter Property="Content" Value="Hidden"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 

追加ボーナス:ultr短い解決策:

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Content" Value="Hidden" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Revealed}" Value="True"> 
      <Setter Property="Content" Value="{Binding Content.ContentName}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

問題を解決しませんでした。また、あなたは答えを投稿するために基づいていることを言っていない:) –

+0

あなたのコードをテストし、私の答えを更新! – Arcturus

+0

大丈夫です!それは私が話していたものです:)。私は最初のアプローチを使用します。なぜなら、それは2番目のものに絡み合っているからではなく、今はそれを機能させようとしていたからです。実際にボタンの中にいくつかのものを作り出す必要があります。 。しかし、詳しい答えと、なぜこれがうまくいかなかったのかについての主な説明はありがたいです。 –

関連する問題