2017-04-18 42 views
0

我試圖在WPF中創建一個可重用的textblock用戶控件。其基本思路是:在WPF中創建一個自我更新的Textblock用戶控件

  • 用戶不直接指定文本塊的內容
  • 有在我的用戶控三種扶養性質稱爲IsToggledToggleTrueTextToggleFalseText
  • 如果IsToggled爲真,則控件將顯示ToggleTrueText;或者如果IsToggled爲假,則顯示ToggleFalseText
  • 當運行時IsToggled變化,文本自動切換到任何ToggleTrueTextToggleFalseText

我開始加入了PropertyChangedCallbackIsToggled DP:用戶控件的

代碼隱藏:

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 

...

private static void OnToggleStateChanged(DependencyObject d, 
DependencyPropertyChangedEventArgs e) 
{ 
    ... 
} 

XAML中用戶控件:

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

但是,我不知道什麼是最好的方式,以確保TheTextBlock更新每當IsToggled運行時改變它的文本。

+0

這是不可能知道的,因爲你沒有刻意去提供[MCVE]我們展示你在做什麼。但假設'Grid'和它的'TextBlock'在'UserControl' XAML中,那麼你應該有一個'UserControl'專用的視圖模型,它可以用作'TextBlock'的數據上下文。或者,或者直接在'OnToggleStateChanged()'方法中將該屬性設置爲'TheTextBlock.Text'。請改善問題,清楚你正在做什麼以及需要什麼幫助。 –

+0

爲什麼不只是創建一個CLR屬性並將其綁定到您的textblock文本屬性,並且不要忘記實現INotifyPropertyChanged。 – tabby

回答

1

試試這個:

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

如果你想的TextBlock你需要確保Text屬性綁定你對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> 
相關問題