我想要做什么:當我的視圖被加載時,可以看到幾個文本框是必填欄位(標記為紅色)。只要這些文本框沒有填寫,按鈕“NEXT”就被禁用,否則啟用:

按鈕的 XAML:
<Grid Grid.Row="10" Grid.RowSpan="2" Grid.Column="11" Grid.ColumnSpan="2">
<Button ToolTip="Die Pflichtfelder bitte ausfüllen!" Content="WEITER ZU GRUNDLAGEN" Command="{Binding AngebotKopieren}" Grid.ColumnSpan="2"></Button>
</Grid>
我嘗試了什么:在互聯網上,我閱讀了有關 RelayCommand 的資訊,因此決定將其添加到我的專案中以實作上述目標。在 Viewmodel 的建構式中,我像這樣包含它:
public MyViewModel()
{
AngebotKopieren = new RelayCommand(CopyTemplate, CanCopyTemplate);
}
private ICommand _angebotKopieren;
public ICommand AngebotKopieren
{
get { return _angebotKopieren; }
set { _angebotKopieren = value; OnPropertyChanged("AngebotKopieren"); }
}
如您所見,我使用了兩種方法,稱為CopyTemplate()和CanCopyTemplate()。目前,第一個做什么并不重要,但后者應該在所有必填欄位都填寫時回傳 true,否則回傳 false。對于這個例子,為了簡單起見,我只使用了一個必填欄位:
private bool CanCopyTemplate(object obj)
{
if(//(String.IsNullOrEmpty(Nachname) && String.IsNullOrEmpty(Vorname) && String.IsNullOrEmpty(Angebotstitel) &&
String.IsNullOrEmpty(SelAnrede) //&& String.IsNullOrEmpty(StrasseWohnort) && String.IsNullOrEmpty(PLZ_Wohnort)
//&& String.IsNullOrEmpty(Wohnort)))
)
{
return false;
}
return true;
}
但是,當我填寫 SelAnrede(系結到 Combobox Selected Item 屬性且 Update Source Trigger=On Property Changed 的??字串時,該按鈕仍然處于禁用狀態。我缺少什么?為什么我更改時不會呼叫 CanExecuteChanged()-Method視圖中的 SelItem 屬性?為什么不再呼叫 CanCopyTemplate() 方法?
這是 RelayCommand-Class 以獲得更好的概述:
public class RelayCommand : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Konstruktoren
/// <summary>
/// Erzeugt ein neues Command, das immer ausführen kann.
/// </summary>
/// <param name="execute">Die Ausführungslogik...</param>
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
/// <summary>
/// Erzeugt ein neues Command
/// </summary>
/// <param name="execute">Die Ausführungslogik...</param>
/// <param name="canExecute">Die Logik zum Ausführungsstatus...</param>
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Konstruktoren
#region ICommand Members
[DebuggerStepThrough]
public bool CanExecute(object parameters)
{
return _canExecute == null ? true : _canExecute(parameters);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested = value; }
remove { CommandManager.RequerySuggested -= value; }
}
event EventHandler ICommand.CanExecuteChanged
{
add
{
//throw new NotImplementedException();
}
remove
{
//throw new NotImplementedException();
}
}
public void Execute(object parameters)
{
_execute(parameters);
}
#endregion // ICommand Members
}
uj5u.com熱心網友回復:
每當設定了在命令的方法中檢查其值的屬性時CanCopyTemplate,您應該呼叫引發其CanExecuteChanged事件的命令的方法。
因此,例如,您的SelAnrede屬性的設定器應該像這樣實作:
private string _selAnrede;
public string SelAnrede
{
get { return _selAnrede; }
set
{
_selAnrede = value;
OnPropertyChanged(nameof(SelAnrede));
CommandManager.InvalidateRequerySuggested();
}
}
該CanExecuteChanged事件不是“自動”引發的,但大多數實作ICommand都有一種方法可以為您引發它。您只需要確保您實際呼叫它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/465771.html
