WPF数据绑定仅在更改时更新

时间:2019-01-20 12:01:47

标签: c# .net wpf data-binding livecharts

因此,我几天以来一直在仔细研究类似的问题。我只想知道为什么会出现此问题。我有一个带有属性的类和一个用于实时图表的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落后。当我尝试更改其文本时,textboxxes将更新为模型值。这很奇怪,因为:

  1. 数据绑定工作正常,因此UI应立即更新。
  2. 在UI中输入新值时,模型属性应更改,而不是UI。

(也尝试了没有UpdateSourceTrigger的版本)。

在我直接绑定到DLVOConfiguration之前,一切正常。

我知道您的模型视图可以从INotifyPropertyChanged继承,但是由于某种原因,我遇到了同样的问题。 编辑: 我为这个问题使用INotifyPropertyChanged的情况添加了代码: WPF DataBinding not updating?

    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));
    }

1 个答案:

答案 0 :(得分:0)

我猜您正在替换绑定到某处的实例。这破坏了数据绑定。只要您仅使用新值更新属性,它就可以正常工作。