在WPF / MVVM应用程序中设置“编辑”状态

在WPF应用程序中使用MVVM模式,我要处理记录的“编辑状态”
每次用户开始编辑记录时,该窗口应切换到“编辑”模式,该代码可以通过名为IsEditing的布尔属性轻松地在代码中表示。
这允许激活/停用UI按钮等。

我知道这样的属性应该放在ViewModel中。
但是如何确保用户一旦开始编辑其中一个字段,IsEditing设置为true?
我发现的唯一方法是将IsEditing明确分配给模型字段的包装器。 是否有更好,更聪明的方式来做到这一点,也许以集中的方式?我在方法中看到的弊端是遗忘某个字段的冗长和可能。
也许有一种完全不同的方法从一开始就可以处理此类问题?

我的模型(虽然不应该是实体框架核心):

public class City
{
    public string Id { get; set; }
    public string Name { get; set; }
}

关联的ViewModel(我仅包含相关代码):

public class CityVM : INotifyPropertyChanged
{

    private bool _isEditing;
    public bool IsEditing
    {
        get { return _isEditing; }
        set
        {
            if (value!=_isEditing)
            {
                _isEditing = value;
                NotifyPropertyChanged(); 

            }
        }
    }

    public string Name
    {
        get { return _model.Name; }
        set
        {

            if (value!=_model.Name) 
            {
                _model.Name = value;
                NotifyPropertyChanged();
                IsEditing = true;
            }
        }
    }

}
milu_yaya 回答:在WPF / MVVM应用程序中设置“编辑”状态

我了解您的问题,并且已经遇到了同样的问题。我的解决方案基于触发器触发GotFocus和LostFocus的命令来更新布尔值,我知道这不是最好的选择,但我是唯一的选择。

我将准备一个片段并更新我的回复。

编辑:我找到了一种更好的方法。

创建行为并将其附加到文本框,是一种更清洁的解决方案。这不会让您的代码成为我的第一个建议。 :)

public static class EditingStateBehavior
{
    #region IsEditing

    public static bool GetIsEditing(DependencyObject obj) => (bool)obj.GetValue(IsEditingProperty);

    public static void SetIsEditing(DependencyObject obj,bool value) => obj.SetValue(IsEditingProperty,value);

    public static readonly DependencyProperty IsEditingProperty =
       DependencyProperty.Register(
       "IsEditing",typeof(bool),typeof(EditingStateBehavior));

    #endregion IsEditing

    #region Enabling

    public static bool GetIsEditingEnabled(DependencyObject obj) => (bool)obj.GetValue(IsEditingEnabledProperty);

    public static void SetIsEditingEnabled(DependencyObject obj,bool value) => obj.SetValue(IsEditingEnabledProperty,value);

    public static readonly DependencyProperty IsEditingEnabledProperty =
        DependencyProperty.Register(
        "IsEditingEnabled",typeof(TextBox),new PropertyMetadata(OnIsEditingEnabledChanged));

    private static void OnIsEditingEnabledChanged(object sender,DependencyPropertyChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox is null) return;

        textBox.GotFocus += (x,p) => UpdateStatus(x as FrameworkElement,true);
        textBox.LostFocus += (x,false);

        //Also,you cam implement something to handle if you don't want to receive notifications anymore....
    }

    private static void UpdateStatus(FrameworkElement frameworkElement,bool value) => frameworkElement.SetValue(IsEditingProperty,value);

    #endregion Enabling
}

并在您的文本框中:

 <TextBox
        Grid.Row="1"
        Margin="3" Grid.ColumnSpan="1"
        VerticalContentAlignment="Center"
        local:EditingStateBehavior.IsEditing="{Binding IsEditing,Mode=TwoWay}"
        local:EditingStateBehavior.IsEditingEnabled="True"
        Text="{Binding SomeText}" />
  

别忘了把Mode:TwoWay放进去

由于需要获取文本框引用来挂接事件,因此必须存在“ IsEditingEnabled”,因此在加载窗口时将触发“ OnIsEditingEnabledChanged”,从而为“监视器”提供正确的控件。当然,如果您要实现一个控件以停止监视编辑状态或更改事件,则将在那里更改。

我做了一个小项目对其进行测试,可以随意查看。

https://github.com/mateusavelar/EditingStatePoc-WPF

本文链接:https://www.f2er.com/3108506.html

大家都在问