MVVM ile bir WPF projesi üzerinde çalışıyorum ve kaydet düğmesine tıkladığımda son metin değişikliğini almama sorunuyla karşılaştım.
Bileşenlerim şu şekilde ayarlandı:
- Kaydet düğmesine sahip araç çubuğu sanal makinesine sahip bir araç çubuğu görünümü. düğme click olayı bir Icommand'a bağlıdır.
- Sepreate sanal makinesine bağlı bir grup metin alanına sahip bir form görünümü.
- araç çubuğu görünümü ve form görünümü ayrı dosyalardadır.
- tüm sanal makinelerim Bindablebase'den (Prizmanın bir parçası.MvvM paketi)
Düğmeye tıklandığında, değerleri VM formundan alıp kaydedeceğim... ileri basit ve stragight. Son alanı düzenledikten sonra kaydet düğmesini tıklatmanın odağı kaybetme olayını tetiklememesi dışında her şey yolunda. Bu nedenle, özellik Kümesi olayı tetiklenmez. Düzenledikten sonra alanlardan uzağa tıklamanız ve ardından düğmeye tıklamanız gerekecek. İşte kodum:
public class ViewModel: BindableBase
{
private string _someText;
public string SomeText
{
get { return _someText; }
set { SetProperty(ref _someText, value); }
}
}
XAML görünümünde:
<TextBox Text="{Binding SomeText}"/>
araç çubuğunda XAML:
<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>
Araç çubuğu için ViewModel:
public class ToolbarViewModel : BindableBase
{
private ICommand _saveCommand;
public ICommand SaveCommand
{
get
{
return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => {
//Save code
}, () => true));
}
}
}
BaseCommandHandler için kod:
public class BaseCommandHandler : ICommand
{
private Action _action;
private Func<bool> _canExecute;
/// <summary>
/// Creates instance of the command handler
/// </summary>
/// <param name="action">Action to be executed by the command</param>
/// <param name="canExecute">A bolean property to containing current permissions to execute the command</param>
public BaseCommandHandler(Action action, Func<bool> canExecute)
{
_action = action;
_canExecute = canExecute;
}
/// <summary>
/// Wires CanExecuteChanged event
/// </summary>
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
/// <summary>
/// Forcess checking if execute is allowed
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
return _canExecute.Invoke();
}
public void Execute(object parameter)
{
_action();
}
}
Odağın kaybolduğundan emin olmanın temiz bir yolunu veya bağlanabilir özelliklerin set olayını tetiklemenin bir yolunu bilen var mı