WPF MVVM Düğme Tıklatıldığında metin değişiklikleri nasıl alınır

0

Soru

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ı:

  1. 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.
  2. Sepreate sanal makinesine bağlı bir grup metin alanına sahip bir form görünümü.
  3. araç çubuğu görünümü ve form görünümü ayrı dosyalardadır.
  4. 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ı

2-way-object-databinding c# mvvm prism
2021-11-23 08:41:19
1

En iyi cevabı

1

UpdateSourceTrigger kullanmalısınız PropertyChanged =

<TextBox Text="{Binding TextValue, UpdateSourceTrigger=PropertyChanged}"/>

2021-11-23 08:59:41

Aslında, bir düğmeyi tıklatmak, metin kutusu için odak kaybı anlamına gelir, bu nedenle güncelleştirilmesi gerekir.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, durumun böyle olduğunu düşündüm, ama ne yazık ki, hayır, odağı kaybetmeyi tetiklemiyor
Just another Dev

@Haukinger, araç çubuğu ve metin formu ayrı denetimlerde olduğu için mi merak ediyorum? yine de mantıklı değil....
Just another Dev

@ JustanotherDev araç çubuğu ve form denetimlerinin ayrı görünüm modelleri varsa, kesinlikle kaynak olabilir.
Jeffery

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................