C# 在setter内更改属性值时更新视图

C# 在setter内更改属性值时更新视图,c#,wpf,mvvm,C#,Wpf,Mvvm,我的视图中有一个复选框,它已绑定到viewmodel中的属性。当我选中/取消选中该复选框时,属性的setter中有一个条件,如果该条件为true,该条件将更新相同的属性。但当属性更新时,相应的视图不会更改 代码如下: 视图: 我认为这是两个onPropertyChanged事件触发的结果,一个值为true,一个值为false 通常对于这种逻辑,我更喜欢使用PropertyChanged事件,而不是将逻辑隐藏在属性设置器中 public class MyClass() { public M

我的视图中有一个复选框,它已绑定到viewmodel中的属性。当我选中/取消选中该复选框时,属性的setter中有一个条件,如果该条件为true,该条件将更新相同的属性。但当属性更新时,相应的视图不会更改

代码如下: 视图:


我认为这是两个
onPropertyChanged
事件触发的结果,一个值为
true
,一个值为
false

通常对于这种逻辑,我更喜欢使用PropertyChanged事件,而不是将逻辑隐藏在属性设置器中

public class MyClass()
{
    public MyClass()
    {
        // attach property changed in constructor
        this.PropertyChanged += MyClass_PropertyChanged;
    }

    private void MyClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "HoldingPen")
            OnHoldingPenCheckChanged();
    }

    public bool HoldingPen
    {
        get{ m_holdingPen; }
        set
        {
            if (m_hodingPen == value)
                return; 

            m_hodingPen=value;
            onPropertyChanged("HoldingPen");
        }
    }

    public void OnHoldingPenCheckChanged()
    {
        if(HoldingPen && some other condition)
        {
            HoldingPen=false;  //Here view should be updated simultaneously 
        }
    }
}

这还有一个额外的好处,就是可以使用任何自定义代码在一个位置修改一个值,而不是在查找某个内容时遍历每个设置程序。

如果将
OnHoldingPenCheckChanged
放在
onPropertyChanged
行之前,是否有效?我想这可能与事件的时间有关不,它不起作用。我尝试了所有的排列和组合。你尝试过这个吗<代码>是的,也试过了。那不起作用。在属性的setter中更改属性的值简直是臭不可闻。只需获取您的值,执行检查,确定属性的最终值,设置一次,然后在值实际更改时触发更改事件。或者,完全不要胡说八道——用一个单独的属性来表示HoldingPen+的状态和其他一些条件(不知道这是否合适,但闻起来比较少:/)我对你的答案投了赞成票,因为它总体上是好的,但是在这里我不明白为什么不检查setter内部的条件并避免所有的错误complexity@DudiKeleti我主要反对将逻辑放入setter是为了调试。我发现有一个位置可以检查是否有任何特殊逻辑同时应用于任意数量的属性,而不必检查每个setter,这要容易得多。通过将其全部放在PropertyChanged事件中,我可以保持所有属性定义的通用性,并且不必搜索它们以查看它们是否有任何作用special@VishalChavan我认为可能还有其他问题,可能是DataContext或PropertyChange通知的实现。您的代码是否与问题中的代码完全相同?我已经用您的原始代码和我在这里发布的PropertyChanged代码进行了测试,两者都运行良好。
public bool HoldingPen
{
  get{m_holdingPen;}
  set
  {
    m_hodingPen=value;
    onPropertyChanged("HoldingPen");
    OnHoldingPenCheckChanged();
  }

public void OnHoldingPenCheckChanged()
{
  if(HoldingPen && some other condition)
  {
    HoldingPen=false;  //Here view should be updated simultaneously 
  }
}
public class MyClass()
{
    public MyClass()
    {
        // attach property changed in constructor
        this.PropertyChanged += MyClass_PropertyChanged;
    }

    private void MyClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "HoldingPen")
            OnHoldingPenCheckChanged();
    }

    public bool HoldingPen
    {
        get{ m_holdingPen; }
        set
        {
            if (m_hodingPen == value)
                return; 

            m_hodingPen=value;
            onPropertyChanged("HoldingPen");
        }
    }

    public void OnHoldingPenCheckChanged()
    {
        if(HoldingPen && some other condition)
        {
            HoldingPen=false;  //Here view should be updated simultaneously 
        }
    }
}