我是WPF的新手,试图尽可能地坚持MVVM模式。到目前为止,一切都很好,除了我遇到了一个问题,从我的模型绑定某些属性。
所以我有非静态属性,我已经暴露在我的模型中,但他们只能从模型内更改。我运行了一些函数,它做了很多事情,它通过一些参数来记录它所做的事情,这些参数是我公开给大家看的。
我很好,当我有属性在我的ViewModel -我可以更新这些ok,因为我已经实现了INotifyPropertyChanged。我看到有时人们也在他们的模型中实现了这一点,所以我尝试过,但不知道INotifyPropertyChanged是如何真正工作的,我不知道是否还有其他我需要做的事情来让它在模型中运行。
我试图在我的ViewModel中创建一个属性,从模型中读取,我将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
}
}
在xaml
<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>
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
}
}
<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>
我的一个朋友也在犯同样的错误。
// rest of class including code that changes the above **_TempRelayValue**
在中,您已经声明您将更改_tempRelayVAlue变量。变量没有与之关联的任何通知。所以你要做的是像下面这样通过属性设置值,这应该通知UI模型或VM值已经改变。因为您已经将通知实现到属性而不是变量中。
TempRelayValue = yourvalues;