Значение Обновление уведомлений между ViewModels - PullRequest
1 голос
/ 29 апреля 2020

У меня есть вкладка Control, с вкладкой «Экзамены» и «Шаблоны». Я хочу поделиться информацией между двумя вкладками.

Мой фон в основном в Интернете с React и Redux, поэтому мой инстинкт заключается в том, чтобы общая информация (типа модели Exam) принадлежала MainWindow, вероятно, как оконный ресурс.

Мой технический руководитель, который намного опытнее меня - во всем, но также и в C#, хотя он также новичок в WPF), уверяет меня, что это не способ сделать это в этом установив, что ViewModels вкладок должны делиться / передавать информацию.

Поэтому я настроил свой базовый пользовательский интерфейс c с текстовым полем на вкладке «Экзамены» и меткой для отображения содержимого текстовое поле на вкладке Шаблоны.

<Page x:Class="Gui.Tabs.ExamsTab.ExamsHome" Title="ExamsTab">
    <Grid VerticalAlignment="Center">
        <StackPanel>
            <Label Content="EXAMS TAB" />
            <TextBox Text="{Binding ExamString, UpdateSourceTrigger=PropertyChanged}"/>
            <Label Content="{Binding ExamString}" />
        </StackPanel>
    </Grid>
</Page>

--------

<Page x:Class="Gui.Tabs.TemplatesTab.TemplatesHome" Title="TemplatesHome">
    <Grid VerticalAlignment="Center">
        <StackPanel>
            <Label Content="TEMPLATES TAB"/>
            <Label Content="Text from Exams tab:"/>
            <Label BorderBrush="Red" BorderThickness="1" Content="{Binding StringFromExamsTab}"/>
        </StackPanel>
    </Grid>
</Page>

И я лучше всего смонтировал ViewModels: (кодовый код и модели для просмотра находятся сейчас в одном файле)

namespace Gui.Tabs.ExamsTab {
    public partial class ExamsHome : Page {
        public ExamsHome() {
            InitializeComponent();
            DataContext = ViewModel;
        }
        public static readonly ExamsTabViewModel ViewModel = new ExamsTabViewModel();
    }

    public class ExamsTabViewModel :INotifyPropertyChanged {
        private string _examString = "Default exam string";

        public string ExamString {
            get => _examString;
            set {
                _examString = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = "") {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

------

namespace Gui.Tabs.TemplatesTab {
    public partial class TemplatesHome : Page {
        public TemplatesHome() {
            InitializeComponent();
            DataContext = viewModel;
        }

        public static readonly TemplatesTabViewModel viewModel = new TemplatesTabViewModel();
    }

    public class TemplatesTabViewModel {
        public string StringFromExamsTab {
            // needs to be notified of value change!
            get => ExamsHome.ViewModel.ExamString;
        }
    }
}

На вкладке «Экзамены» текстовое поле и соответствующая ему метка синхронизируются. И на вкладке Шаблоны в красном поле написано «Строка экзамена по умолчанию», но оно не меняется со значением в текстовом поле.

Я читал, что:

Механизм привязки XAML прослушивает [PropertyChangedEvent] для каждого связанного свойства в классах, которые реализуют интерфейс INotifyPropertyChanged

Что подразумевает для меня, что, пока INotifyPropertyChanged реализован в ВМ экзаменов, необходимо уведомлять привязки на вкладке Шаблоны.

Как я могу заставить эту работу работать? Открыта возможность того, что я делаю это полностью (или в основном) неправильно.

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