【问题标题】:Access bound variables that come from parent user control访问来自父用户控件的绑定变量
【发布时间】:2018-09-27 20:56:29
【问题描述】:

我有一个父用户控件,其中包含另一个名为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 的代码隐藏中访问名称和详细信息变量。最后一个用户控件的数据上下文是否与其父用户控件(即视图模型类)的数据上下文相同?

【问题讨论】:

  • 不,DataContext 是 SelectedTrain 属性返回的任何内容。
  • @mm8 我可以从代码隐藏(我的意思是,从子用户控件)访问它吗?
  • 请看我的回答。

标签: c# wpf xaml data-binding datacontext


【解决方案1】:

但我想知道是否可以从 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

【讨论】:

  • 感谢您的准确回答。我理解你的代码,但你知道我为什么会收到null DataContext 吗?
  • 我想我有。 DataContext 是null,直到我从列表框中选择了一些东西。 This question 给了我一个提示(以防万一这对某人有帮助)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2021-10-01
  • 1970-01-01
  • 2016-10-26
  • 2015-12-10
相关资源
最近更新 更多