Доступ к связанным переменным, которые поступают из родительского элемента управления - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть родительский пользовательский элемент управления, который содержит еще один элемент с именем TrainDetailsControl.Контекст данных родительского пользовательского элемента управления установлен в класс ViewModel (см. Ниже).

<UserControl>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding Trains}"
                 SelectedItem="{Binding SelectedTrain}"
                 DisplayMemberPath="Name"/>
        <local:TrainDetailsControl Grid.Column="1" DataContext="{Binding SelectedTrain}"/>
    </Grid>
</UserControl>

Что я делаю, это "передаю" выбранный поезд из списка в TrainDetailsControls.Внутри этого пользовательского элемента управления я показываю детали выбранного объекта поезда.

<UserControl>
    <StackPanel>
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding Details}"/>
    </StackPanel>
</UserControl>

Это ViewModel с общими переменными (это не полный код, просто чтобы дать вам представление).

public class TrainViewModel : ViewModelBase
{
    public ObservableCollection<Train> Trains { get; }
        = new ObservableCollection<Train>();

    private Train selectedTrain;
    public Train SelectedTrain
    {
        get { return selectedTrain; }
        set { SetValue(ref selectedTrain, value); }
    }
}

Это хорошо работает, так как, когда я выбираю элемент поезда из списка, его детали правильно отображаются в другом пользовательском элементе управления.Но мне интересно, можно ли получить доступ к переменным Name и Details из кода в TrainDetailsControl.Будет ли контекст данных этого последнего пользовательского элемента управления совпадать с контекстом данных его родительского пользовательского элемента управления (т. Е. Класса модели представления)?

1 Ответ

0 голосов
/ 27 сентября 2018

Но мне интересно, можно ли получить доступ к переменным Name и Details из кода в TrainDetailsControl

Конечно.Просто приведите DataContext к Train после загрузки представления:

public partial class TrainDetailsControl : UserControl
{
    public TrainDetailsControl()
    {
        InitializeComponent();
        Loaded += (s, e) =>
        {
            Train selectedTrain = DataContext as Train;
            if (selectedTrain != null)
            {
                //...
            }
        };
    }
}

Будет ли контекст данных этого последнего пользовательского элемента управления совпадать с контекстом данных его родительского пользовательского элемента управления(т.е. класс модели представления)?

Нет, это будет объект, который SelectedTrain возвращает, поскольку вы связали свойство DataContext с этим свойством источника.Если вы явно не установите свойство DataContext, DataContext будет унаследован от родительского UserControl.

...