2014-03-01 35 views
2

我有一個文本框樣式的按鈕來清除文本框的值,
但是當事件點擊按鈕時,該值消失並在釋放按鈕鼠標時重新出現。 下面的XAML代碼:如何從模板重置TextBox的TextBox文本?只有在xaml

<ResourceDictionary ..... 

<Style x:Key="SearchBoxTemplate" TargetType="{x:Type TextBox}"> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type TextBox}"> 
    <Border BorderBrush="LightGray" BorderThickness="1"> 
    <StackPanel Orientation="Horizontal" > 
     <Grid Width="{TemplateBinding Width}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="8.6*" /> 
      <ColumnDefinition Width="1.4*" /> 
     </Grid.ColumnDefinitions> 
     <TextBox Background="Transparent" x:Name="searchTextBox" Grid.Column="0" 
       HorizontalAlignment="Stretch" BorderThickness="0" 
       Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay}" 
       Height="{TemplateBinding Height}" /> 
     <Button Background="Transparent" 
       x:Name="clearButton" Content="X" 
       Margin="2" Width="Auto" Height="Auto" 
       Grid.Column="1"/> 
     </Grid> 
    </StackPanel> 
    </Border> 
    <ControlTemplate.Triggers> 
    <Trigger SourceName="clearButton" Property="IsPressed" Value="True" > 
     <Setter TargetName="searchTextBox" Property="TextBox.Text" Value="" /> 
    </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

而且使用像:

<TextBox Style="{StaticResource SearchBoxTemplate}" 
      Width="200" 
      Text="{Binding SearchLastName, 
        UpdateSourceTrigger=PropertyChanged, 
        Mode=TwoWay}" /> 

// C# SearchViewModel 

internal class SearchViewModel : ViewModelBase 
{ 
private string _searchLastName; 

public string SearchLastName 
{ 
    get { return this._searchLastName; } 
    set 
    { 
     this._searchLastName = value; 
     OnPropertyChanged("SearchLastName"); 
    } 
} 
...... 

怎麼了,這可能嗎? 有人可以幫助我嗎?

Regards

+0

您的目標是明確的綁定屬性,或者你只是想改變它顯示在控制的文本? – Chris

+0

兩者,我想如果一個人也被刪除了! 這是不正確的? – MacGile

回答

1

觸發器將自動執行IsPressed =「False」的操作。編寫一個偵聽IsPressed =「False」的觸發器。

更新答案:

<Style x:Key="SearchBoxTemplate" TargetType="{x:Type TextBox}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type TextBox}"> 
          <Border BorderBrush="LightGray" BorderThickness="1"> 
           <StackPanel Orientation="Horizontal" > 
            <Grid Width="{TemplateBinding Width}"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="8.6*" /> 
              <ColumnDefinition Width="1.4*" /> 
             </Grid.ColumnDefinitions> 
             <TextBox Background="Transparent" x:Name="searchTextBox" Grid.Column="0" 
       HorizontalAlignment="Stretch" BorderThickness="0" 

       Height="{TemplateBinding Height}" /> 
             <Button Background="Transparent" 
       x:Name="clearButton" Content="X" 
       Margin="2" Width="Auto" Height="Auto" 
       Grid.Column="1"/> 
            </Grid> 
           </StackPanel> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger SourceName="clearButton" Property="IsPressed" Value="True" > 
            <Setter TargetName="searchTextBox" Property="Text" Value="" /> 
           </Trigger> 

          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

<TextBox Style="{StaticResource SearchBoxTemplate}" 
      Width="200" 
      Text="{Binding SearchLastName,Mode=TwoWay, 
        UpdateSourceTrigger=PropertyChanged 
        }" /> 

視圖模型:

internal class SearchViewModel : INotifyPropertyChanged 
    { 
     public void RaisePropertyChanged(string propertyname) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private string _searchLastName=string.Empty; 

     public string SearchLastName 
     { 
      get { return _searchLastName; } 
      set 
      { 
       _searchLastName = value; 
       RaisePropertyChanged("SearchLastName"); 
      } 
     } 

    } 
+0

我試過IsPressed錯誤和真實,不工作。 當我輸入文本框時,viewModel中的屬性不會更改,並且onpropertyChanged事件不會觸發。 – MacGile

+0

就好像事件沒有傳播一樣! – MacGile

+0

你的解決方案很好地清除了文本,但是在SearchViewModel中沒有更新事件激發:( 當我輸入文本時,SearchLastName沒有更新 當我點擊清除按鈕時,SearchLastName也不會更新 – MacGile

1

我不認爲這是可能做到這一點在相當你atttempting(雖然我可能是錯的)的方式。

我的理解是,(在按下按鈕前)在一審中,你TextBox命名searchTextBox將獲得從ParentTemplate指定的Path它的價值,在TextBox.Text財產 - 這勢必給當地SearchLastName財產。

當你按下按鈕,你覆蓋已設置的searchTextBox控制,使TextBox.Text值不再從綁定PathSearchLastName獲得的結合,它不是簡單地設置爲空字符串文字"",這是您所看到的顯示內容(從您的ParentTemplateTrigger設置)。

一旦釋放按鈕,綁定將恢復到之前的Path到您的屬性,該屬性從未更改過,並且保持不變。

如果您想要清除SearchLastName屬性,您必須使按鈕觸發一個清除搜索條件的命令/操作,或者操縱控件的屬性(我相信有辦法執行完全在相對綁定的用戶界面中,但對於一個簡單的問題它可能是一個棘手的解決方案)。我不相信你可以通過切換模板來做到這一點。

+0

是的,這似乎是發生什麼:( – MacGile

0

第一個問題是您在文本框內模板上缺少UpdateSourceTrigger = PropertyChanged。 TextBox的默認值是LostFocus。您需要將其設置爲PropertyChanged以防希望在textBox中輸入時更新源屬性。

<TextBox Background="Transparent" x:Name="searchTextBox" Grid.Column="0" 
     HorizontalAlignment="Stretch" BorderThickness="0" 
     Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     Height="{TemplateBinding Height}" /> 

,您已經在按鈕的IsPressed值使用Trigger。所以,一旦IsPressed價值逆轉,它將會恢復。IsPressed狀態是暫時的,您需要更新Click事件上的綁定屬性,您可以通過EventTrigger來實現,但很遺憾,它不能包含setter。

因此,您應該更改Text,將其綁定到ViewModel中的ICommand,並簡單地設置命令方法的基礎綁定屬性。

0
您的意見

最後我這樣做:

在SearchviewModel

..... 
    private ICommand clearCommand; 
    public ICommand ClearCommand 
    { 
     get 
     { 
      if (this.clearCommand == null) 
       this.clearCommand = new RelayCommand(() => this.ClearSearch(),()=> CanSearch()); 

      return this.clearCommand; 
     } 
    } 

    void ClearSearch() 
    { 
     Search = string.Empty; 
    } 

    bool CanSearch() 
    { 
     return !string.IsNullOrEmpty(_search); 
    } 
    ..... 

在風格

<Style.... 
    <Button 
    .... 
    Command="{Binding ClearCommand}" /> 
</Style> 

而且我已刪除觸發

它的工作很好,但我想純xaml。

非常感謝所有:)

問候

+0

但你仍然需要添加'UpdateSourceTrigger = PropertyChanged',以防你希望source屬性在文本框中輸入而不是lostFocus。 –

+0

我做到了,你可以在我的第一篇文章中看到:) – MacGile

+0

我意思是爲模板內的textBox 'searchTextBox',不在外面的.. –