[英]Access bound variables that come from parent user control
我有一个父用户控件,其中包含另一个名为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变量。 最后一个用户控件的数据上下文是否与其父用户控件(即视图模型类)的数据上下文相同?
但是我想知道是否可以从TrainDetailsControl的代码隐藏中访问Name和Details变量
当然。 加载视图后,只需将DataContext
为Train
即可:
public partial class TrainDetailsControl : UserControl
{
public TrainDetailsControl()
{
InitializeComponent();
Loaded += (s, e) =>
{
Train selectedTrain = DataContext as Train;
if (selectedTrain != null)
{
//...
}
};
}
}
最后一个用户控件的数据上下文是否与其父用户控件(即视图模型类)的数据上下文相同?
不,因为您已将DataContext
属性绑定到此源属性,所以SelectedTrain
将返回该对象。 如果未显式设置DataContext属性,则DataContext将从父UserControl
继承。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.