2013-07-30 70 views
0

我有一個依賴屬性,我叫IsPromptShown用戶控制:WPF觸發TextBox.Text不起作用

public static DependencyProperty IsPromptShownProperty = DependencyProperty. 
    Register("IsPromptShown", typeof(bool), typeof(AutoCompleteSearchBox), new 
    PropertyMetadata(true)); 

public bool IsPromptShown 
{ 
    get { return (bool)GetValue(IsPromptShownProperty); } 
    set { SetValue(IsPromptShownProperty, value); } 
} 

這自定義控件包含TextBox。該文本框沒有分配給它的Text財產的任何值:

<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top" 
    GotFocus="SearchTextBox_GotFocus" LostFocus="SearchTextBox_LostFocus" 
    TextChanged="SearchTextBox_TextChanged"/> 

現在我設置在託管窗口下面的觸發器:

<Trigger Property="IsPromptShown" Value="True"> 
    <!--<Setter Property="FontStyle" Value="Italic"/>--> 
    <Setter Property="TextBox.Text" Value="Seek"/> 
</Trigger> 

的註釋行,設置FontStyle的作品,但第二個設置TextBox.Text沒有。我也一直試圖設置Foreground屬性,那也失敗了。到底是怎麼回事?

+0

你是如何在託管窗口中設置dataContext的?在文本框本身而不是窗口上設置觸發器 – makc

+0

@makc _TextBox_不會看到僅在我的自定義控件級別上可見的_IsPromptShown_依賴項屬性。是否有能力爲內部文本框聲明依賴項屬性? –

+0

定義內部文本框,我錯過了整個圖片...我猜測,但也許附加屬性將幫助 – makc

回答

0

我找到了解決方案。這不是微不足道的,但工作。假設我們有一個自定義UserControl,其中包含一個TextBox和ather控件。我們希望能夠根據某些bool UserControl.IsSomething依賴項屬性爲每個內部控件分配樣式。首先,我們必須聲明另一個依賴項屬性Style UserControl.AlternativeStyle。然後,我們才能切換附加一個事件處理程序IsSomething當前StyleAlternativeStyleIsSomething改變:

public static DependencyProperty AlternativeStyleProperty = 
    DependencyProperty.Register(
     "AlternativeStyle", 
     typeof(Style), 
     typeof(MyUserControl)); 

public Style AlternativeStyle 
{ 
    get { return (Style)GetValue(AlternativeStyleProperty); } 
    set { SetValue(AlternativeStyleProperty, value); } 
} 

public static DependencyProperty IsSomethingProperty = 
    DependencyProperty.Register(
     "IsSomething", 
     typeof(bool), 
     typeof(MyUserControl), 
     new PropertyMetadata(true, IsSomethingProperty_Changed)); 

public bool IsSomething 
{ 
    get { return (bool)GetValue(IsSomethingProperty); } 
    set { SetValue(IsSomethingProperty, value); } 
} 

private static void IsSomethingProperty_Changed(
    DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    // Swap styles 
    // e.g. 
    // var tempStyle = Style; 
    // Style = AlternativeStyle; 
    // AlternativeStyle = tempStyle; 
} 

比較困難的部分是有關設置AlternativeStyle定製UserControl之外。下面是如何實現的,在窗口的XAML承載我們的自定義控制:

<Window.Resources> 
    <Style x:Key="DefaultTextBoxStyle" TargetType="TextBox"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
    <Style x:Key="DefaultUserControlStyle" TargetType="local:MyUserControl"> 
     <Style.Resources> 
      <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}"> 
       <Setter Property="Background" Value="Blue"/> 
      </Style> 
     </Style.Resources> 
    </Style> 
    <Style x:Key="AlternativeUserControlStyle" TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}"> 
     <Style.Resources> 
      <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}"> 
       <Setter Property="Background" Value="Green"/> 
      </Style> 
     </Style.Resources> 
    </Style> 
    <Style TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}"> 
     <Setter Property="AlternativeStyle" Value="{StaticResource AlternativeUserControlStyle}"/> 
    </Style> 
</Window.Resources> 

以上樣式將全自動加入,當我們改變IsSomething值,那麼另類的風格將被應用到的MyUserControl所有實例所有者變更了IsSomething

1

我認爲問題是你不能從外部訪問你的UserControl中的文本框的TextProperty!

嘗試創建一個Text DependencyProperty,它設置UserControl內的文本框的值並在觸發器中設置該屬性!

+0

但是,然後我將不得不公開所有樣式可能性每個在單獨的依賴屬性。我想擁有一個布爾屬性,並允許用戶根據該屬性的值從外部設置樣式。他可能會顯示一些文字,但也會更改其他控件的顏色或其他樣式。 –

3

當我開始使用WPF時,遇到類似問題。你只需要用不同的方式來看待事物。而不是查看IsPromptShown屬性的值,並嘗試更改Trigger中中TextBox的屬性,反之亦然。查看IsPromptShown財產的價值,並嘗試更改TextBox,Trigger,TextBox中的財產。

<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top" 
    GotFocus="SearchTextBox" LostFocus="SearchTextBox_LostFocus" 
    TextChanged="SearchTextBox_TextChanged"> 
    <TextBox.Style> 
     <Style> 
      <Setter Property="TextBox.Text" Value="Default value if required" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsPromptShown, ElementName=This}" 
        Value="True"> 
        <Setter Property="TextBox.Text" Value="Seek" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

需要注意的是這個工作,你將需要添加Name=ThisUserControl的聲明。這只是讓框架知道在哪裏可以找到IsPromptShown屬性......如果您願意,您可以輕鬆使用RelativeSource Binding

+0

這是一個想法,但我需要一個允許在自定義控件之外設置觸發內容的解決方案,並且應該能夠改變其他內部自定義控件的樣式,而不僅僅是TextBox。 –

+1

這將允許...只需從'UserControl'之外設置'IsPromptShown'屬性。並嘗試修復每個帖子的一個問題......你的問題標題是「TextBox.Text的WPF觸發器不起作用」。爲其他問題添加新帖子。 – Sheridan