【问题标题】:MVVM Light RaisePropertyChanged dosen't workMVVM Light RaisePropertyChanged 不起作用
【发布时间】:2014-06-14 21:00:44
【问题描述】:

在模型中有这个:

 namespace PlanszaGlowna.Model
 {
     public class PlanszaGlowna
     {
         public bool CzyWidoczny { get; set; }

在 ViewModel 中有这个

namespace PlanszaGlowna.WidokModelu
{
    public class PlanszaGlowna : ViewModelBase
    {
        private Model.PlanszaGlowna m_PlanszaGlowna;

        public bool CzyWidoczny
        {
            get { return m_PlanszaGlowna.CzyWidoczny; }
            set
            {
                m_PlanszaGlowna.CzyWidoczny = value;
                RaisePropertyChanged(() => CzyWidoczny);
            }
        }

还有那个绑定:

         <UserControl x:Class="PlanszaGlowna.Widok.PlanszaGlowna" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         Visibility="{Binding Path=CzyWidoczny, Converter={StaticResource Bool2VisibilityKonwerter}, Mode=TwoWay}"

当我在 ViewModel 中为 CzyWidoczny 设置新值时,UI 不会更新。我正在使用 MVVM Light。

【问题讨论】:

  • 我可能会因为非英文属性名称而遗漏一些东西,但是您在哪里设置数据上下文?
  • @user3714853 你如何以及在哪里设置DataContext?改变初始值有影响吗?
  • 我在父视图中设置数据上下文: 在第一次设置 CzyWidoczny 属性时,视图获取值,但在另一组中却没有。
  • 在黑暗中拍摄,但在您的PlanszaGlowna.Widok.PlanszaGlowna UserControl 中,您会执行DataContext = this; 之类的操作或以其他方式设置吗?
  • 我认为 DataContext 没问题,因为其他属性显示正确。当我在 ViewModel 中更改 CzyWidoczny 属性时,他输入了 setter 并更改了模型中的属性,但在 RaisePropertyChanged 之后他们没有进入 getter。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

问题是模型类 PlanszaGlowna.Model.PlanszaGlowna 没有实现 INotifiyPropertyChanged

所以实现相同并更改为

 public class PlanszaGlowna : INotifiyPropertyChanged
 {
    ...
    private _CzyWidoczny;
    public bool CzyWidoczny
    {
        get { return _CzyWidoczny; }
        set
        {
            _CzyWidoczny = value;
            RaisePropertyChanged("CzyWidoczny");
        }
    }

只要您的类 PlanszaGlowna.Model.PlanszaGlowna 实现 INotifiyPropertyChanged 并且您已创建包装方法 RaisePropertyChanged 来调用 PropertyChanged 事件,这将起作用

【讨论】:

    【解决方案2】:

    如果您尝试这样的绑定:

     <UserControl x:Class="PlanszaGlowna.Widok.PlanszaGlowna" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         Visibility="{Binding Path=CzyWidoczny, Converter={StaticResource Bool2VisibilityKonwerter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    

    添加 UpdateSourceTrigger=PropertyChanged 进行绑定。还要修改您的属性已使用下一个结构创建:

    private string _text= "";
    public string Text
        {
            get { return _text; }
            set { _text= value; RaisePropertyChanged("Text"); }
        }    
    

    如果 Text 属性属于一个类,则它具有下一个结构:

    public class NewClass: INotifyPropertyChanged
    {
    
        public event PropertyChangedEventHandler PropertyChanged;
        private string _text;
        public string Text
        {
            get { return _text; }
            set
            {
                if ( _text!= value)
                {
                    _text= value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Text"));
                    }
                }
            }
        } 
    } 
    

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多