2017-04-18 14 views
0

私はWPFで再利用可能なテキストブロックユーザーコントロールを作成しようとしています。次のように基本的な考え方は次のとおりです。WPFで自己更新のTextblockユーザーコントロールを作成する

  • ユーザが直接テキストブロックの内容を指定していない
  • 3つの依存性のIsToggledと呼ばれる私のユーザーコントロールのプロパティ、ToggleTrueText、およびToggleFalseTextがあります。
  • IsToggledがtrueの場合、コントロールにはToggleTrueTextと表示されます。 IsToggledがfalseの場合はToggleFalseTextを表示します。ユーザーコントロールの

    コードビハインド:実行時にIsToggled変更は、テキストが自動的にToggleTrueTextまたはToggleFalseText

のいずれかに変更すると

  • は私がIsToggled DPにPropertyChangedCallbackを添加することによって開始

    public static readonly DependencyProperty IsToggledProperty = 
         DependencyProperty.Register("IsToggled", typeof(bool), 
         typeof(TagToggle), new PropertyMetadata(new 
         PropertyChangedCallback(OnToggleStateChanged))); 
    
    public bool IsToggled 
    { 
        get { return (bool)GetValue(IsToggledProperty); } 
        set { SetValue(IsToggledProperty, value); } 
    } 
    
    //ToggleTrueText and ToggleFalseText are declared similarly to IsToggled 
    

    ...

    ユーザーコントロールの

    XAML:

    <Grid x:Name="LayoutRoot"> 
        <TextBlock x:Name="TheTextBlock" Text="{Binding WhatDoIBindTo}"/> 
    </Grid> 
    

    しかし、私は、実行時に変更をIsToggledたびTheTextBlockは、そのテキストを更新していることを確認するための最良の方法だろうかわからないんだけど。

  • +0

    あなたは[MCVE]何をやっている私たちを示すを提供するために、気にしませんでしたので、それは、知ることは不可能です。しかし、 'Grid'と' TextBlock'が 'UserControl'のXAMLにあると仮定すると、' TextBlock'のデータコンテキストとして使うことができる 'UserControl'専用のビューモデルが必要です。どちらか、または 'OnToggleStateChanged()'メソッドでプロパティを 'TheTextBlock.Text'として明示的に設定するだけです。質問を改善して、あなたが何をしているのか、何が助けを必要としているのかを明確にしてください。 –

    +0

    あなたは単にCLRプロパティを作成し、それをテキストブロックテキストプロパティにバインドしないでください。なぜなら、INotifyPropertyChangedの実装を忘れることはありません。 – tabby

    答えて

    1

    下に確認してください。この のトリガを使用することができ、この試してみてください:あなたはTextBlockTextプロパティをバインドする場合は、必ずことを確認する必要があり

    private static void OnToggleStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
        TagToggle ctrl = d as TagToggle; 
        if (ctrl != null) 
        { 
         TheTextBlock.Text = ctrl.IsToggled ? ToggleTrueText. : ToggleFalseText; 
        } 
    } 
    

    UserControlの特性に結合している。あなたはTextBlockDataContextプロパティを設定することにより、これを行うことができます:

    <TextBlock x:Name="TheTextBlock" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
        <TextBlock.Style> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Setter Property="Text" Value="{Binding ToggleTrueText}" /> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding IsToggled}" Value="False"> 
            <Setter Property="Text" Value="{Binding ToggleFalseText}"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </TextBlock.Style> 
    </TextBlock> 
    
    0

    あなたはコード

    <TextBlock x:Name="TheTextBlock"> 
        <TextBlock.Style> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding IsToggled}" Value="True"> 
            <Setter Property="Text" Value="{Binding ToggleTrueText}"/> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding IsToggled}" Value="False"> 
            <Setter Property="Text" Value="{Binding ToggleFalseText}"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </TextBlock.Style> 
    </TextBlock> 
    
    関連する問題