我有一个父用户控件,该控件包含另一个名为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变量。最后一个用户控件的数据上下文是否与其父用户控件(即视图模型类)的数据上下文相同?
答案 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
继承。