【发布时间】:2018-09-20 11:53:23
【问题描述】:
我有以下问题:我在父用户控件中有两个不同的用户控件。它们是trainList,它包含一个火车对象列表和trainView,它是一个用户控件,在列表中显示所选火车的详细信息。
我希望与trainView 共享一个变量trainList。
我现在拥有的是:
父用户控制:
<UserControl>
<UserControl>
<customControls:trainList x:Name="trainList"></customControls:trainList>
</UserControl>
<UserControl>
<customControls:trainView x:Name="trainView"></customControls:trainView>
</UserControl>
<TextBlock DataContext="{Binding ElementName=trainList, Path=SelectedTrain}" Text="{ Binding SelectedTrain.Id }">Test text</TextBlock>
</UserControl>
TrainList 类:
public partial class TrainList : UserControl
{
public TrainList()
{
this.InitializeComponent();
this.DataContext = this;
}
public Train SelectedTrain { get; set; }
public void SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Debug.Print(this.SelectedTrain.Id);
}
}
注意:Train 类实现了INotifyPropertyChanged。
如果我让它工作,我会将绑定应用到 trainView 用户控件(不确定这是否会工作)而不是文本块。
<UserControl>
<customControls:trainView x:Name="trainView" DataContext="{Binding ElementName=trainList, Path=SelectedTrain}"></customControls:trainView>
</UserControl>
然后,我会以某种方式从 trainView 的代码隐藏中访问该变量。
(在此之后,我想与其父用户控件共享一个与 trainView 不同的变量,但也许这是另一个问题)。
我目前的问题是:可以这样做还是我需要遵循另一种策略?
【问题讨论】:
-
首先,在任何情况下都不应在 UserControl 的构造函数中使用
DataContext = this;,因为它会破坏其依赖属性的任何典型的基于 DataContext 的绑定。其次,两个用户控件应该共享一个comman view model,它可以由外部的UserControl提供。 TrainList 和 TrainView(或其共同内容)的属性将绑定到公共视图模型,该模型将保存 SelectedTrain 属性和具有所有火车列表的另一个属性。 -
@Clemens 感谢您的回答。我是 WPF 新手,从未应用过 MVVM 模式。我不知道给我一个你提到的通用视图模型的示例实现是否太过分。