Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Prism 5.0在ViewModel中包裹模型属性_C#_Wpf_Mvvm - Fatal编程技术网

C# Prism 5.0在ViewModel中包裹模型属性

C# Prism 5.0在ViewModel中包裹模型属性,c#,wpf,mvvm,C#,Wpf,Mvvm,你好,我对Prism比较陌生,但我的问题是: 我目前正在使用Prism 5和WPF。我已经创建了一个模型、视图模型和视图。当模型中的属性更改时,视图将更新。我的问题是:当我想要处理来自模型的属性(例如另一个属性名)时,视图不会得到更新。这是我的密码。如果你能帮助我,我将非常感激 当模型中的运行着色更改时,视图不会更新 模型 视图模型 public class MainWindowViewModel : BindableBase { private MyModel model;

你好,我对Prism比较陌生,但我的问题是:

我目前正在使用Prism 5和WPF。我已经创建了一个模型、视图模型和视图。当模型中的属性更改时,视图将更新。我的问题是:当我想要处理来自模型的属性(例如另一个属性名)时,视图不会得到更新。这是我的密码。如果你能帮助我,我将非常感激

当模型中的运行着色更改时,视图不会更新

模型

视图模型

public class MainWindowViewModel : BindableBase
{

    private MyModel model;
    public MyModel Model
    {
        get { return this.model; }
        set { SetProperty(ref this.model, value); }
    }

    public MainWindowViewModel()
    {
        this.Model=new MyModel();

    }


    public Boolean RunTinting2
    {
        get { return this.model.RunTinting; }
        set { SetProperty(ref this._RunTinting, value); }
    }

 }
XAML


如果动态设置模型属性,视图应绑定到此属性,而不是视图模型属性:

<Label x:Name="label1_Copy11" Content="{Binding Model.RunTinting}" HorizontalAlignment="Left" Margin="366,320,0,0" VerticalAlignment="Top" Height="25" Width="85" >

因为当模型的属性设置为新值时,视图模型不会引发任何更改通知

另一个选项是通过视图模型的包装器属性设置模型属性,也就是说,不直接设置模型属性,而是设置视图模型属性。确保随后在包装器属性的setter中设置模型的属性,并为视图绑定到的视图模型属性引发PropertyChanged事件:

public class MainWindowViewModel : BindableBase
{
...
   public Boolean RunTinting2
  {
    get { return this.model.RunTinting; }
    set { this.model.RunTinting = value; OnPropertyChanged("RunTinting2"); }
  }
}

<Label x:Name="label1_Copy11" Content="{Binding RunTinting2}" HorizontalAlignment="Left" Margin="366,320,0,0" VerticalAlignment="Top" Height="25" Width="85" >
公共类MainWindowViewModel:BindableBase { ... 公共布尔值RunTinting2 { 获取{返回this.model.RunTinting;} 设置{this.model.RunTinting=value;OnPropertyChanged(“RunTinting 2”);} } }
这就是我解决这个问题的方法,谢谢瑞秋和威尔

视图模型

    public void InitModel()
    {
        Model.PropertyChanged += Model_PropertyChanged;
    }

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "RunTinting")
        { 
            OnPropertyChanged("RunTinting2");
        }

    }
@我试过你的解决方案,但没用。。。不过还是要感谢你花了这么多时间


我不知道为什么我的答案有负面评价。它可以工作并且尊重mvvm模型

属性更改在属性更改的实例上触发事件。这不会神奇地转移到公开另一个对象的属性的其他对象。但propertychanged事件是否已在Bindable类中?请提供一个可复制的示例,说明如何以及在何处设置属性?您需要设置并绑定到模型属性,或者设置或绑定到视图模型属性。并在设置的属性的setter中引发PropertyChanged事件。@user7268733如果使用第二种解决方案,则需要将PropertyChanged事件处理程序连接到将更改事件复制到ViewModel的
模型
。例如,
model.PropertyChanged
处理程序可能会在PropertyChanged(“RunTinting2”)上说“if(e.PropertyName==”RunTinting“);`以确保在ViewModel层上触发相同的更改事件。这不是一个好的解决方案,因为您正在混合使用Model和ViewModel。ViewModel不应通过INotifyPropertyChanged通知View。ViewModel类应继承自BindableBase,模型应为POCOs。如果您创建并执行通过某种形式的ORM(如EF或Dapper)创建对象数据。Viewmodel继承自BindableBase,模型也继承自BindableBase。这在Prism框架中是可能的。您可以查看Prism的示例项目。作为Prism和MVVM的长期从业者,无论他们的示例显示了什么,您都不应该这样做t性能和线程问题。正如您所说,POCO模型必须更新viewmodel,这可以通过BindableBase完成。您是否改为实现INotifyPropertyChange。(BindableBase已经实现了INotifyPropertyChange)PropertyChanged只能在Dispatcher线程上处理。如果在后台线程上加载或修改可通知对象,UI将不会收到更改通知。如果加载100行,并且模型对象上的每个属性都会引发通知,则将无缘无故引发100多个额外事件-这可能并且确实会导致性能下降随着时间的推移,性能会下降,尤其是当您根据通知链接其他属性中的更改时。模型对象应仅用于封装数据,ViewModel用于绑定到视图并监视更改,View用于显示数据。
public class MainWindowViewModel : BindableBase
{
...
   public Boolean RunTinting2
  {
    get { return this.model.RunTinting; }
    set { this.model.RunTinting = value; OnPropertyChanged("RunTinting2"); }
  }
}

<Label x:Name="label1_Copy11" Content="{Binding RunTinting2}" HorizontalAlignment="Left" Margin="366,320,0,0" VerticalAlignment="Top" Height="25" Width="85" >
    public void InitModel()
    {
        Model.PropertyChanged += Model_PropertyChanged;
    }

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "RunTinting")
        { 
            OnPropertyChanged("RunTinting2");
        }

    }