WPF Databindings обновляется только при изменении - PullRequest
0 голосов
/ 20 января 2019

Итак, я уже несколько дней перебираю похожие вопросы по SO.Я просто хочу знать, почему возникает эта проблема.У меня есть класс со свойствами и коллекция SeriesCollection, используемая для живых графиков, которые привязаны к пользовательскому интерфейсу.Поскольку свойства должны иметь возможность сериализации, коллекция SeriesCollection не может быть частью конкретного вида модели (но должна быть привязана к пользовательскому интерфейсу для построения диаграммы).вот так:

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-файл.Модель обновляется должным образом, но интерфейс отстает.Текстовые поля обновляются до значения моделей, когда я пытаюсь изменить их текст.Это странно, потому что:

  1. Привязка данных работает нормально, поэтому интерфейс должен обновляться немедленно.
  2. При вводе нового значения в пользовательском интерфейсе должно измениться свойство модели, а не пользовательский интерфейс.

(также пробовал версию без UpdateSourceTrigger).

До того, как я подключился напрямую к DLVOConfiguration и все работало нормально.

Я знаю, что есть способ, которымваше представление модели наследуется от INotifyPropertyChanged, но по какой-то причине я столкнулся с той же проблемой.РЕДАКТИРОВАТЬ: я добавил код для случая, в котором я использовал INotifyPropertyChanged из этого вопроса: WPF DataBinding не обновляется?

    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 голосов
/ 22 января 2019

Я полагаю, вы заменяете экземпляр, привязанный к чему-то. Это нарушает привязку данных. Пока вы просто обновляете свойства новыми значениями, все должно работать нормально.

...