Интерфейс MVVM / WPF не обновляется при повторном выполнении метода - PullRequest
0 голосов
/ 15 марта 2020

У меня проблемы с тем, что мой пользовательский интерфейс не обновляется, когда меняются мои свойства, даже если к нему применен INotifyPropertyChange. Когда я запускаю код в первый раз, он отображается правильно и пользовательский интерфейс обновляется. Во время отладки я вижу, что новые значения устанавливаются в строки модели представления и что событие OnPropertChange вызывается, просто ничего не происходит в пользовательском интерфейсе. Код ниже будет в порядке событий. В качестве дополнительной информации я использую один и тот же код для обновления модели представления как в первый, так и во второй раз.

    public partial class Transaktioner : Window
    {
        ViewModelCommon.ViewModel view = new ViewModelCommon.ViewModel();
        private static List<ViewModelCommon.Items2> getAccountingRowsListEdited = new List<ViewModelCommon.Items2>();
        {
            DataContext = view;
            InitializeComponent();
        }

        private async Task GetAccountinTransactionsAsync()
        {
           await Task.Run(() =>
            {
                getAccountingRowsList = client.GetAccountingTransactions(ftglist[index], 0, ref status).ToList();

                foreach (var v in getAccountingRowsList)
                {
                        getAccountingRowsListEdited.Add(new ViewModelCommon.Items2
                        {
                            itemName2 = v.ver.ToString(),
                            value2 = v.text,
                            vertyp = v.vtyp,
                            s2 = v.kto.ToString(),
                            s3 = v.trdat.ToString()
                        });
                }
                Task.Run(async () =>
                {
                    await SearchAndDisplayResult();
                });
            });
        }

        private async Task SearchAndDisplayResult(int exclusion = 0)
        {
            await Task.Run(() =>
             {
                var verfikationer = getAccountingRowsListEdited.Where(u => u.vertyp != exclusion).Count(u => u.s2.ToString().Equals("0"));

                view.VerifikationerTotal = verfikationer.ToString();

             });
        }

Модель представления:

class ViewModelCommon
    {
        public abstract class ViewModelBase : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;

            protected bool SetProperty<T>(ref T field, T newValue, [CallerMemberName]string propertyName = null)
            {
                if (!EqualityComparer<T>.Default.Equals(field, newValue))
                {
                    field = newValue;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
                    return true;
                }
                return false;
            }

            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }
            protected void Test(string sb)
            {
                Transaktioner tr = new Transaktioner("");
                tr.ExcludeStringChanged(sb);
            }
        }

public class ViewModel : ViewModelBase
        {
            private string _verifikationerTotal;
            public string VerifikationerTotal
            {
                get { return _verifikationerTotal; }
                set
                {
                    if (value != _verifikationerTotal)
                    {
                        _verifikationerTotal = value;
                        OnPropertyChanged("VerifikationerTotal");
                    }
                }
            }

            private string _ExcludeString;
            public string ExcludeString
            {
                get { return _ExcludeString; }
                set
                {
                    if (value != _ExcludeString)
                    {
                        _ExcludeString = value;
                        OnPropertyChanged("ExcludeString");
                        Test(ExcludeString);
                    }
                }
            }
        }

WPF:

<TextBox x:Name="TextBoxVerifikationerTotal" Text="{Binding VerifikationerTotal}" IsEnabled="False" HorizontalAlignment="Left" Height="23" Margin="583,182,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="99"/>

<TextBox HorizontalAlignment="Left" Height="23" Margin="837,10,0,0" TextWrapping="Wrap" Text="{Binding Path=ExcludeString, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" VerticalAlignment="Top" Width="286"/>

Код выше работает как положено.

В пользовательском интерфейсе есть возможность ввести необязательный атрибут для исключения значений. Они привязаны к «ExludeString», это также работает и запускает событие, передающее его снова в SearchAndDisplayResult (int exclusion = 0) со значением замены передаваемого int. Во время отладки я вижу, что событие может успешно найти новое значение и передать его в ViewModel, но оно не обновляет пользовательский интерфейс.

Есть ли мысли о том, почему пользовательский интерфейс не обновляется? Заранее спасибо!

Код был сокращен, чтобы показать жизненные показатели

1 Ответ

0 голосов
/ 15 марта 2020

Ответом для этого случая было то, что

ViewModelCommon.ViewModel view = new ViewModelCommon.ViewModel();

не был настроен на частное состояние c при работе с задачами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...