Как получить доступ к переменной в другой модели класса / представления C# - PullRequest
0 голосов
/ 07 мая 2020

Я только начал экспериментировать с C# и просматривать модели, и мне трудно получить значение переменной, выводимой в текстовый блок в файле XAML.

Итак, у меня есть модель просмотра под названием ReplayControlViewModel. cs, который имеет:

public class ReplayControlViewModel : ABCObservableObject

Внутри этого класса я создаю следующее:

public string overallBestSessionLap { get => Get<string>(); set => Set(value); }

И использую его в функции следующим образом:

private void MessageHandler_OnBroadcastingEvent(string sender, BroadcastingEvent evt)
{
  if (evt.Type == BroadcastingCarEventType.BestPersonalLap)
            // record best lap
            overallBestSessionLap = evt.Msg;
}

Я затем есть другая модель представления, называемая SessionInfoViewModel.cs, которая имеет:

public class SessionInfoViewModel : ABCObservableObject

... и связанный файл XAML (SessionInfoView.xaml)

Я пытаюсь получить доступ к переменной следующим образом, но ничего отображается в GUI ....

<TextBlock Text="{Binding overallBestSessionLap}" Margin="5,1"/>

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

Спасибо, Брэд

РЕДАКТИРОВАТЬ (Решение): Для справки, я нашел следующий код в моем MainWindow.xaml , который дал мне лучшее понимание того, как работает привязка.

<Window.DataContext>
    <local:MainViewModel />
</Window.DataContext>

<Broadcasting:SessionInfoView DataContext="{Binding SessionInfoVM}" Grid.Column="1" Grid.Row="0" />
<Broadcasting:ReplayControlView DataContext="{Binding ReplayVM}" Grid.Column="1" Grid.Row="1" />

И в MainViewModel.cs он имел это ....

public class MainViewModel : ABCObservableObject
{
    public SessionInfoViewModel SessionInfoVM { get; }
    public ReplayControlViewModel ReplayVM { get; }

    public MainViewModel()
    {
        SessionInfoVM = new SessionInfoViewModel();
        ReplayVM = new ReplayControlViewModel();
    }
}

1 Ответ

0 голосов
/ 07 мая 2020

Как заявил Кшиштоф, неплохо было бы прочитать о привязке и тексте данных в WPF. Обычно представление имеет ОДИН текст данных (который может использоваться несколькими представлениями). Итак, где-то в вашем коде у вас должен быть sessionInfoView.DataContext =

Еще одна вещь, на которую следует обратить внимание, - это уведомление об изменении. Когда вы устанавливаете значение свойства, к которому привязывается представление, вам необходимо вызвать событие PropertyChanged. Представление "слушает" это событие и обновляет представление.

Нетипично пытаться изменить значения свойств одной модели представления из другой модели представления. Для поддержки модульности модели представления в основном должны быть изолированы (хотя есть несколько исключений). Связь с моделями просмотра обычно осуществляется через Messenger.

Я бы порекомендовал изучить структуру MVVM для WPF. Есть много таких, как Prism или MVVM Light. Примеры могут быть полезны и убирают часть "сантехники". Но выполнение некоторой реализации OnPropertyChanged помогает лучше понять WPF.

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