【问题标题】:MVVM Refresh a ReadOnly Textbox in a System.Windows.Controls.GridMVVM 刷新 System.Windows.Controls.Grid 中的只读文本框
【发布时间】:2023-03-09 11:43:02
【问题描述】:

我有一个网格:

 <Grid Name="MyGrid" DataContext="{Binding MyGridBinded}" >
      <TextBox Text="{Binding Path=Total, Mode=OneWay}" />
 </Grid>

而 MyGridBinded 是一个对象:

 public class GridPOCO
 { 
   public IList myList { get ; set; }
   public Total { get { Return myList.Count; }}
 }

所以当我更新我的 myList 时,我会在我的 ViewModel 中调用:

 Base.OnpropertyChanged("MyGridBinded");

但 Total 没有更新。

如何更新我的只读字段?


@H.B 和@Daniel Rose。

如果我在 GridPOCO 中实现 INotifyPropertyChanged。我可以打电话后:

Base.OnpropertyChanged("Total");

但是 GridPOCO 是一个 POCO 对象,我不想在其中实现 INotifyPropertyChanged。

如果我有时间,我会尝试 Ben 的答案。

【问题讨论】:

  • 这个词是“绑定”,而不是“绑定”
  • 你的意思是public int Total吗?
  • 对不起@H.B 我在和@TKanos 交谈,不认为他的代码示例是正确的。

标签: c# wpf data-binding mvvm binding


【解决方案1】:

您需要命名属性,而不是对象:

Base.OnpropertyChanged("Total");

包含Total proeprty 或其基类之一的对象需要实现 INotifyPropertyChanged,并且需要在属性发生更改的实例上调用该方法

或者,只需使用null 调用它来更新所有属性绑定(您通常会避免这种情况):

Base.OnpropertyChanged(null);

【讨论】:

  • 没有。他对道达尔具有约束力,因此必须为此调用 INPC。绑定引擎不知道 Total 在内部引用了 myList。
【解决方案2】:

我想你可能需要:

 <TextBox Text="{Binding Path=MyGridBinded.Total, Mode=OneWay}" />

并且还要为属性调用属性更改事件(线索在名称中)而不是类。

base.PropertyChanged("MyList");

【讨论】:

  • 只有在删除了 Grid 上的 DataContext 时才会起作用。
【解决方案3】:

您必须为已更改的属性致电 INPC,即

Base.OnpropertyChanged("Total");

GridPOCO 中。这意味着 GridPOCO 必须实现 INotifyPropertyChanged!

【讨论】:

  • 实际上我很肯定它确实工作,该事件需要一个属性名称,而不是一个属性路径,我什至尝试过。你宁愿想要MyGridBinded.OnPropertyChanged("Total") 这样的东西,如果它是可见的。
  • @H.B.你说的对。但是,如果您在不存在的地方调用 INPC for Total(因为它在不同的类中),它将不起作用。
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2015-04-19
  • 2012-03-07
相关资源
最近更新 更多