所以几天来我一直在筛选So上的类似问题。我只是想知道为什么会出现这个问题。我有一个带有属性的类和一个用于实时图表的SeriesCollection,它们绑定到UI。由于属性需要能够序列化,因此SeriesCollection不能是特定模型视图的一部分(但需要绑定到UI以打印图表)。像这样:
public class DLVOModel
{
public SeriesCollection table { get; set; }
public DLVOConfiguration DLVOConfiguration { get; set; }
}
public partial class DLVOModelizer : Window
{
public DLVOModel model { get; set; }
public DLVOModelizer()
{
InitializeComponent();
model = CreateModel();
DataContext = model; //Databinding
}
private DLVOModel CreateModel() => new DLVOModel()
{
DLVOConfiguration = new DLVOConfiguration(),
table = new SeriesCollection(),
};
public class DLVOConfiguration
{
public double HMax { get; set; }
public int Resolution { get; set; }
//... about 25 properties
}
`
XAML:
<window>
<lvc:CartesianChart Series="{Binding Path=table}"/>
<GroupBox DataContext="{Binding DLVOConfiguration}">
<Grid>
<TextBox Text="{Binding Path=HMax, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding Path=Resolution, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</GroupBox>
所以这一切都很好,直到我尝试反序列化一个xml文件。模型得到了适当的更新,但UI落后了。当我尝试更改文本时,文本框会更新为模型值。这很奇怪,因为:
- 数据绑定工作正常,因此UI应该立即更新
- 在UI中输入新值时,应更改模型属性,而不是UI
(还尝试了不带UpdateSourceTrigger的版本)。
在我直接绑定到DLVOConfiguration之前,一切都很好。
我知道您的模型视图有一种从INotifyPropertyChanged继承的方式,但出于某种原因,我遇到了同样的问题。编辑:我从这个问题中添加了使用INotifyPropertyChanged的情况的代码:WPF数据绑定未更新?
public class DLVOConfiguration : INotifyPropertyChanged
{
private double _HMax;
public double HMax
{
get { return _HMax; }
set
{
_HMax = value;
NotifyPropertyChanged("HMax");
}
}
private int _Resolution;
public int Resolution
{
get { return _Resolution; }
set
{
_Resolution = value;
NotifyPropertyChanged("Resolution");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
我猜您正在替换绑定到某个地方的实例。这会破坏数据绑定。只要您只是用新值更新属性,它就应该可以正常工作。