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

时间:2018-09-27 12:45:23

标签: c# wpf xaml data-binding datacontext

我有一个父用户控件,该控件包含另一个名为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); }
    }
}

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

1 个答案:

答案 0 :(得分:2)

  

但是我想知道是否可以从TrainDetailsControl的代码隐藏中访问Name和Details变量

好的。加载视图后,只需将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继承。

相关问题