2016-11-15 6 views
0

単純なブールをコントロールテンプレートのチェックボックスとデータトリガーにバインドしようとしましたが、何も機能していません。このチェックボックスは、テスト目的でのみ使用します。私はすでにここに投稿していますが、ほとんどの問題は、スタイルを使わずにプロパティを直接設定して上書きすることによって発生します。 mouseoverプロパティを使用しているdatatriggerは正常に動作しています。その唯一のboolへのバインディングは動作しません。WPF ControlTemplateのデータバインディングが機能しないC#

マイコードこれまで: CS:

public partial class HostFrame : UserControl 
{ 
    public bool test { get; set; } 

    public HostFrame() 
    { 
     test = true; 
     InitializeComponent();   
    } 
} 

XAML:

<UserControl x:Class="OwnDrawingv2.Elements.HostFrame" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:OwnDrawingv2.Elements" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <Style TargetType="{x:Type local:HostFrame}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type local:HostFrame}"> 
         <Grid Background="LightBlue" Name="host_grid"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
          </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="20"></RowDefinition> 
            <RowDefinition Height="Auto"></RowDefinition> 
           </Grid.RowDefinitions> 
          <ContentPresenter Name="content" Grid.Row="1" Grid.Column="1" /> 
          <CheckBox Grid.Column="0" Grid.Row="0" IsChecked="{Binding Path=test}"> <!--Test prupose--> 
          </CheckBox> 
          <Image Grid.Column="1" Grid.Row="0" Name="attention" Width="30" Height="30" Source="/attention_icon.png"> 
           <Image.Style> 
            <Style TargetType="Image"> 
             <Setter Property="Visibility" Value="Visible"></Setter> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding Path=test}" Value="true"> 

               <Setter Property="Visibility" Value="Hidden"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Image.Style> 
          </Image> 
          <Ellipse Grid.Column="0" Grid.Row="1" Width="10" Height="10" Fill="Black"> 
           <Ellipse.Style> 
            <Style TargetType="Ellipse"> 
             <Setter Property="Visibility" Value="Hidden"></Setter> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding ElementName=content, Path=IsMouseOver}" Value="true"> 
               <Setter Property="Visibility" Value="Visible"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Ellipse.Style> 
          </Ellipse> 
          <Ellipse Grid.Column="2" Grid.Row="1" Width="10" Height="10" Fill="Black"> 
           <Ellipse.Style> 
            <Style TargetType="Ellipse"> 
             <Setter Property="Visibility" Value="Hidden"></Setter> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding ElementName=content, Path=IsMouseOver}" Value="true"> 
               <Setter Property="Visibility" Value="Visible"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Ellipse.Style> 
          </Ellipse> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 
</UserControl> 

UPDATE:私は私の元の質問のための答えを持って、私はこれを理解しています。しかし、Webにはなぜ親戚なしで動くように見えるチュートリアルがありますか? UPDATE2:Datacontextに関する回答情報が1件ありませんでした。ありがとうございます。問題は解決された。

+1

ファーストをするだろう、あなたの ' test'プロパティにプロパティ変更通知メカニズムがありません。プロパティがUserControlで宣言されているので、それは確かに依存性プロパティ(値の変更について通知する)である必要があります。次に、DataTrigger Bindingにソースオブジェクトがありません。 {Binding Path = test、RelativeSource = {RelativeSource AncestorType = UserControl}} 'を試してください。 – Clemens

+0

こんにちは、ありがとうございます。最初の部分について:この実装は後に続く;)これを投稿することができ、それを答えとしてマークする。 – Sceen

答えて

0

と言う)。 あなたは2つの解決策を持っています(私は推測します)

1テストプロパティをViewModelに移動し、バインディングを行います。 2 - 使用RelativeResourceとFindAncestor方法({Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

PS:あなたのHostFrameは...コントロール、UIElementから継承する場合、たDependencyPropertyを定義する方がよいとすべてのTemplateBindingの

+0

このヒントをありがとうございました、今、私はトピックに関する詳細情報を得るためにいくつかのドキュメント/チュートリアルを探しています。リンクがありますか? – Sceen

+0

[このリンク](http://www.codeproject.com/Tips/599954/WPF-TemplateBinding-with-ControlTemplate)は、TemplateBindingの簡単なチュートリアルです –

1

あなたのUserControlDatacontextを設定していないため、nullになると想定しています。あなたの出力にバインディングエラーが表示されます。

一方、あなたのプロパティーtestは変更を通知しません。 IsChecked="{Binding Path=test}"の場合は、UserControlクラスがそれ自身のDataContextであることを意味する(またはViewModelの一部ではなく)UserControlに属している場合は、それを依存プロパティとして宣言する必要があります(ViewModelの一部ではなく)。

+0

UserControlの親からDataContextを継承しないようにするため、UserControlのDataContextを明示的に設定しないでください。代わりに、常にUserControlのXAMLで 'RelativeSource'または' ElementName' Bindingsを使用してください。 – Clemens

+0

@Clemens、そうですが、親があるかどうかに関わらず、UserControlの使用方法に関する情報が不足していました。私は「明示的にDataContextを設定する」という意味ではなく、「何らかの種類のDataContextを持っていることを確認する」という意味ではありません。私は十分にはっきりしていなかった。 – Natxo

関連する問題