Как правильно вызвать метод / GetProperty с помощью Caliburn.Micro, если WPF привязан к объектам - PullRequest
0 голосов
/ 06 августа 2020

Я потратил некоторое время на то, чтобы почесать голову, пытаясь реализовать INotifyPropertyChanged внутри классов на их свойствах, NotifyOfPropertyChange() для Caliburn.Micro, но не могу решить эту, казалось бы, простую проблему без необходимости RelayCommand вызывается, когда элемент изменяется в представлении, которое, как я думал, побеждает точку Caliburn.Micro. Я ошибаюсь?

Вопрос 1: Я хочу запускать свойство get / method каждый раз, когда изменяется одно из свойств внутри объекта. Как бы вы сделали это правильно?

Вопрос 2: соответствует ли моя текущая реализация традиционному использованию Caliburn.Micro? WordModels собирается из API с набором строковых и целочисленных свойств.

public class WordModel
{
    public int Id { get; set; }
    public int WordTypeId { get; set; }
    public string Word { get; set; } 
    .
    .
    .
}
  • В представлении пользователю разрешено выбрать WordModel из списка, который По соглашению Caliburn.Micro ему присвоено имя SelectedWordModel в ViewModel.
  • В представлении будут отображаться все свойства SelectedWordModel в представлении, поскольку они привязаны к объекту SelectedWordModel.
<TextBox Name="Word"
    Text="{Binding SelectedWordModel.Word}">
</TextBox>
  • Затем пользователь может изменить свойства SelectedWordModel в представлении, которое мгновенно распространяется благодаря этим простым привязкам.
  • Я хочу связать <Button x:Name="ChangeWord"> могу выполнить property CanChangeWord, чтобы каждый раз, когда свойство в SelectedWordModel изменяется без необходимости реализации всех свойств в виртуальной машине по отдельности и отдельной привязки их к SelectedWordModel в виртуальной машине.
        public WordModel SelectedWordModel
        {
            get
            {
                return _selectedWordModel;
            }
            set
            {
                _selectedWordModel = value;
                NotifyOfPropertyChange(() => SelectedWordModel);
                NotifyOfPropertyChange(() => CanAddWord);
            }
        }
  • Этот вул d означает наличие около 20 свойств, которые все вызывают NotifyOfPropertyChange(() => CanChangeWord) вместо одного объекта SelectedWordModel, который мог бы вызывать это при обновлении любого из его членов. Я начал реализовывать INotifyPropertyChanged для всех свойств объекта в классе, а затем понял, что хочу, чтобы это работало ниже (что, очевидно, не работает, потому что событие PropertyChanged не срабатывает для всего объекта при изменении свойств внутри, только когда сам объект адаптирован).

  • Я подумал о том, чтобы прикрепить команду ко всем свойствам в представлении, которая будет вызывать свойство CanChangeWord, уведомляя об изменении (или просто если Я реализую его как метод public bool CanChangeWord), но я действительно чувствую, что делаю больше кода, чем нужно.

<TextBox Name="Word"
           Text="{Binding SelectedWordModel.Word}">

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <i:InvokeCommandAction Command="{Binding WordModelChangedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

</TextBox>

Я упустил что-то важное?

Заранее спасибо всем, кто это прочитал, это самое большое, что мне удалось написать за весь день!

...