2010-02-08 75 views
1

在我的WPF應用程序中,我有一個TextBox和一個按鈕。該按鈕有一個命令綁定到一個命令,該命令將對文本執行某些操作。從命令修改用戶界面 - 在WPF中使用命令綁定

<TextBox x:Name="_textBox"></TextBox> 
<Button Command="{Binding SomeCommand}" 
     CommandParameter="{Binding ElementName=_text, Path=Text}" 
     Content="Trigger SomeCommand" /> 

現在,我想按一下按鈕,也清除文本框的作用。這樣做的最好方法是什麼?我看到兩個選項:

我也可以在按鈕上添加Click事件 - 使其清除文本。這聽起來對我來說不是一個好主意,因爲我會在兩個地方分割行動,依靠他們執行的順序是正確的。

我現在使用的選項是傳遞整個TextBox而不是TextBox.Text屬性。這樣做的命令可以首先獲取文本,使用它,然後清除文本框。我的結合是一樣的,但沒有「路徑」:

<TextBox x:Name="_textBox"></TextBox> 
<Button Command="{Binding SomeCommand}" 
     CommandParameter="{Binding ElementName=_text}" 
     Content="Trigger SomeCommand" /> 

我的命令的關鍵部位:

public class SomeCommand : ICommand 
{ 
    .... 
    public void Execute(object parameter) 
     var textBox = parameter as TextBox; 
     if (inputTextBox == null) return; 
     DoSomething(textBox.Text); 
     textBox.Clear(); 
    } 
} 

我對這個問題是命令現在依賴於一個UI組件,並且UI取決於該命令以實際對其進行一些修改。我對此並不滿意。有沒有更好的辦法?

回答

2

請考慮將文本框文本綁定到Command的實現主體中可用的屬性。做這個綁定,你可以很容易地從你的ViewModel中清除它。

示例(XAML):

<TextBox x:Name="_textBox" Text={Binding Path=XYZ}></TextBox> 
<Button Command="{Binding SomeCommand}" 
     Content="Trigger SomeCommand" /> 

例(C#):

public class SomeCommand : ICommand 
    { 
     .... 

     public void Execute(object parameter) 
     { 
      //...actions... 
      MyViewModelinstance.XYZ = String.Empty; 
     } 
    } 

請給我留言,如果它的工作原理。

編輯:您正在使用MVVM設計模式,所以它應該很明顯,但我會提醒它以防萬一:在更改XYZ之後,您必須通知UI,此屬性已更改。你可以通過例如通過VM實現INotifyPropertyChanged接口來完成。

+0

我正在使用MVVM模式,聽起來你是對的。我會將textfield綁定到相同ViewModel的某個屬性,該屬性包含需要清除它的命令。我相信這聽起來很合理。明天會有更仔細的觀察。謝謝! – stiank81 2010-02-08 22:12:13

+0

請做,我相信它會幫助你。 – 2010-02-08 23:22:04

+0

你是對的。沒有做到這一點酷似提出,但實質上我存儲在視圖模型的價值,使該命令使用存儲在視圖模型的價值,也很清楚它之後。謝謝! – stiank81 2010-02-09 11:21:37