访问来自父用户控件的绑定变量

Access bound variables that come from parent user control

我有一个父用户控件,其中包含另一个名为 TrainDetailsControl 的控件。父用户控件的数据上下文设置为 ViewModel class(见下文)。

<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>

我所做的是 "pass" 将列表框中的 selected 训练到 TrainDetailsControls。在该用户控件中,我显示了 selected 列车对象的详细信息。

<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); }
    }
}

这很好用,因为当我 select 列表框中的一个序列项时,它的详细信息会在其他用户控件中正确显示。但我想知道是否可以从 TrainDetailsControl 中的代码隐藏访问 Name 和 Details 变量。最后一个用户控件的数据上下文是否与其父用户控件(即视图模型 class)的数据上下文相同?

But I'm wondering if it is possible to access Name and Details variables from code-behind in TrainDetailsControl

当然可以。加载视图后,只需将 DataContext 转换为 Train

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

Would the data context of this last user control be the same as the data context of its parent user control (i.e. the view model class)?

不,它会是 SelectedTrain returns 的对象,因为您已将 DataContext 属性 绑定到此源 属性。如果您没有显式设置 DataContext 属性,DataContext 将从父 UserControl 继承。