[英]MVVM Light - usage of RaiseCanExecuteChanged for RelayCommand
我正在使用MVVM模式。 在我看來,我有用於“個人”詳細信息的文本框,其中之一是idBox。 此外,該視圖由幾個按鈕組成,其中之一是editModeBtn。
我希望僅在idBox中有有效的int時才啟用editModeBtn。
我的editBtn Xaml(在視圖中)如下所示:
<Button x:Name="editModeBtn" Content="Edit" Command="{Binding ChangeToEditScreenCommand}" CommandParameter="{Binding ElementName=idBox, Path=Text}"></Button>
在相應的viewModel中,我有以下代碼:
private RelayCommand<string> _changeToEditScreenCommand;
public RelayCommand<string> ChangeToEditScreenCommand
{
get
{
if (_changeToEditScreenCommand == null)
{
_changeToEditScreenCommand = new RelayCommand<string>((param) => ChangeToEditScreen(), (param) => CanEdit(param));
}
return _changeToEditScreenCommand;
}
}
另外,在CanExecute方法(在我的情況下為CanEdit)中,我想檢查參數(id)是否設置為有效的int,然后返回true。 錯誤,否則。
private bool CanEdit(string currentInsertedId)
{
int idValue;
bool result = Int32.TryParse(currentInsertedId, out idValue);
if (result)
{
if (idValue > 0) { return true; };
return false;
}
return false;
}
基本上,我希望每次在idBox中寫入或刪除某些內容時都調用該命令的canExecute方法。 我應該將命令的RaiseCanExecuteChanged()放在哪里? 如果我沒有使用過MVVM,則可以將其放在textBox textChanged事件中,但實際情況並非如此。 從未使用過RaiseCanExecuteChanged,因此只想確保即可。 謝謝!
為什么要沿着傳遞CommandParameter
的路走下去? 您不能僅使用UpdateSourceTrigger=PropertyChanged
將TextBox.Text
屬性綁定到VM。 一旦TextBox中的文本更改,這應該獲取VM中Text的bound屬性更新,而不是TextBox失去焦點時的默認屬性。
在您的情況下,這就是您似乎想要的行為。 因此,與所有你需要的是一個RelayCommand
為您的命令,而不是一個RelayCommand<T>
有一個參數。
所以說簡單的xaml顯示上述方法:
<TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding ButtonCommand}"
Content="My Button" />
並在VM中:
public string Title {
get {
return _title;
}
set {
if (_title == value) {
return;
}
_title = value;
RaisePropertyChanged(() => Title);
}
}
public RelayCommand ButtonCommand { get; private set; }
private bool CanEdit(string title) {
int idValue;
bool result = Int32.TryParse(title, out idValue);
if (!result) {
return false;
}
return idValue > 0;
}
ctor() {
ButtonCommand = new RelayCommand(() => Debug.WriteLine("Called"), () => CanEdit(Title));
}
這本身將實現您的查詢。 但是對於您使用RaiseCanExecuteChanged()
,在本示例中, Title
的屬性設置器與關聯的TextBox的textChanged事件處理程序有點相似(我說這是因為設置器現在每次在文本框中更改文本時都會被調用)
因此,要完全保證在文本更改時可以調用CanExecute()
,可以從Title
屬性設置器中調用ButtonCommand.RaiseCanExecuteChanged()
,在該屬性引發它的PropertyChanged事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.