我是 WPF 的新手,尽可能地坚持 MVVM 模式。到目前为止一切都很好,除了我遇到了从我的模型绑定某些属性的问题。
因此,我在模型中公开了非静态属性,但它们只能在模型中进行更改。我运行了一些功能,它做了很多事情,它通过我公开查看的一堆参数来跟踪它在做什么。
当我的 ViewModel 中有属性时我很好 - 我可以更新这些,因为我已经实现了 INotifyPropertyChanged。我已经看到有时人们也在他们的模型中实现了这一点,所以我尝试了这一点,但不知道 INotifyPropertyChanged 是如何真正工作的
我试图在我的 ViewModel 中创建一个从 Model 读取的属性,并将 xaml 绑定到这个属性,但是因为我无法从 ViewModel 更改它,所以我遇到了告诉 UI 它已更改的相同问题。目前我在尝试解决这个问题时直接绑定,但我的目标是能够绑定到 ViewModel 中的一个属性,该属性只是从模型中获取值。
谁能给我一个很好的简单示例,说明单向绑定到基本控件(如标签/文本块等),当模型内部发生所有变化时,它们会自行更新?
为了完整起见,这里是我所拥有的示例 xaml 的简化版本(显示绑定到模型属性和绑定到来自 ViewModel 的属性)。绑定有效,因为如果我对模型进行更改,它们会出现在设计器和初始构建中。
该模型是我自己的代码,我可以添加/删除任何内容以使其正常工作。也许这相当简单,但我目前还没有看到解决方案,也没有在论坛上看到任何对我有意义的东西。
谢谢!
在模型中
public enum TempValues { zero, pos10, pos50, pos100 }
namespace AutoCalModel
{
public class AutoCalibration : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
private TempValues _TempRelayValue = TempValues.zero;
public TempValues TempRelayValue
{
get { return _TempRelayValue; }
set
{
if (!value.Equals( _TempRelayValue))
{
_TempRelayValue = value;
NotifyPropertyChanged("TempRelayValue");
}
}
}
// rest of class including code that changes the above TempRelayValue
// accessed through the public property only
}
}
在xml中
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Name="labelPrsTitle" Text="Prs:" Margin="2,0,2,0"/>
<TextBlock Name="labelPrsValue" Text="{Binding Path=currentPrsValueString, Mode=OneWay}" Margin="2,0,5,0"/>
<Separator Margin="5,0,5,0"/>
<TextBlock Text="Temp Relay:" Margin="5,0,2,0"/>
<TextBlock Text="{Binding Path=TempRelayValue, Converter={StaticResource tempValuesConverter}, Mode=OneWay}" Margin="2,0,5,0">
<TextBlock.DataContext><Model:AutoCalibration/></TextBlock.DataContext>
</TextBlock>
</StackPanel>