Как получить доступ к одному содержимому Windows из второго окна

#c# #wpf #mvvm #.net-4.0 #timer

#c# #wpf #mvvm #.net-4.0 #таймер

Вопрос:

Мне нужно создать приложение с двумя окнами:

Окно 1 содержит 6 таймеров обратного отсчета.

Окно 2 Здесь будут установлены настройки отдельных таймеров.

Что будет лучшим решением для этой функциональности? Я буду использовать c # wpf и .Net 4.0

Комментарии:

1. что вы пробовали? это должно быть тривиально, что вас останавливает?

2. Должно быть тривиальным просто иметь две формы и создавать их экземпляры. Вы можете ссылаться на компоненты в каждой форме напрямую (если вы не используете несколько потоков), если они общедоступны.

3. @Polynomial никогда не предлагайте получать доступ к элементам управления пользовательского интерфейса одной формы из другой. Это ненадежный и рекомендуемый подход, вместо этого следует использовать свойства и OO approachc. Если вы предоставите текстовое поле Name вместо простого свойства Name, это создаст зависимость, и код больше не будет работать так же или потребует слишком много изменений, если текстовое поле будет заменено меткой, как простой пример…

4. Я использую DispatcherTimer allong с некоторыми временными интервалами и датами.

5. @DavidePiras — Для небольшого приложения это не должно быть слишком большой проблемой, но я понимаю вашу точку зрения. FireFly3000 — вам следует воспользоваться советом Давида и создать свойство, которое переносит элемент управления, к которому вы хотите получить доступ (например public TextBox MyTextBox { get { return this.myTextBox; } set { this.myTextBox = value; } } ), или использовать метод для предоставления определенных функций.

Ответ №1:

MVVM

1. CountDownView представляет собой представление с одним таймером, простой текстовый блок, привязанный к CurrentValue свойству, или что-то более приятное / сложное вместо текстового блока

2. CountDownViewModel представляет сам один таймер, свойство expose int CurrentValue отображается в виде номера обратного отсчета в представлении. Для реализации обратного отсчета вы можете использовать Sytem.Таймеры.Таймер и обработчик прошедших событий просто уменьшают значение свойства currentValue

3. TimersView — для первого окна с 6 таймерами

  • ItemsCountrol / ListView,
  • ItemTemplate — CountDownView
  • ItemsSource — привязан к Timers свойству TimersViewModel , в основном TimersViewModel должен быть установлен в DataContext TimersView, чтобы вы могли указать следующую привязку: (и каждый элемент будет привязан к одному таймеру)

    <ListView ItemsSource="{Binding Timers}" ... />

4. TimersViewModel — IEnumerable<CountDownViewModel> Timers свойство expose

5. SettingsView — панель настроек

PS: INotifyPropertyChanged для всех свойств виртуальной машины, доступных для просмотра

Домашнее задание для вас:

  1. Разберитесь в принципах MVVM, привязках и командах WPF, это было бы полезно для вас на протяжении всей вашей карьеры
  2. Самостоятельно реализуйте связь между TimersViewModel и SettingsViewModel

Комментарии:

1. @FireFly3000: было бы здорово! Также я бы предложил переименовать ваш вопрос в самоописательный, а не такой обобщенный

2. Могу ли я попросить вас описать шаги 2 и 3 немного подробнее?

3. Как я буду устанавливать привязки для шага 3?