【发布时间】:2015-04-14 17:28:39
【问题描述】:
我在这里遇到了一个相当令人沮丧的问题...我有一个包含 TabControl 的 WPF 页面,并且各种 TabItems 的内容是另一个 WPF 页面(托管在一个框架中,因为页面只能有框架或窗口作为家长)。尽管 FlowCalibrationSummaryView 正在显示,但它上面的所有内容都是空的,因为 SummaryViewModel 的数据绑定由于某种原因无法正常工作。这是 XAML 的一部分:
<TabControl Grid.Row="0">
<TabItem Header="Current Calibration">
<TabItem.Content>
<Frame>
<Frame.Content>
<view:FlowCalibrationSummaryView DataContext="{Binding SummaryViewModel}"/>
</Frame.Content>
</Frame>
</TabItem.Content>
</TabItem>
</TabControl>
我在 SummaryViewModel 的 get 上有一个断点,它只会被在父视图模型中构造它的代码击中。这是绑定到的属性:
public const string SummaryViewModelPropertyName = "SummaryViewModel";
private FlowCalibrationSummaryViewModel _SummaryViewModel;
public FlowCalibrationSummaryViewModel SummaryViewModel
{
get { return _SummaryViewModel; }
set
{
if (_SummaryViewModel == value)
return;
_SummaryViewModel = value;
RaisePropertyChanged(SummaryViewModelPropertyName);
}
}
此时我完全被难住了,我一生都无法弄清楚为什么这个绑定不起作用。任何帮助将不胜感激。
更新:这肯定与它在框架中有关。我尝试将 FlowCalibrationSummaryView 更改为 UserControl 而不是 Page 以查看是否有帮助,但没有,然后我尝试将其从包裹的 Frame 中取出并且有效。我项目中的所有视图都是作为 Pages 完成的,所以为了保持一致性,我更希望这是一个 Page,但是我必须将它托管在一个 Frame 中。有什么我在这里遗漏的,还是作为 UserControl 的正确用法?
【问题讨论】:
-
当您使用Snoop 分析您的应用程序时,如果您不 将任何内容显式分配给
DataContext属性,则显示为FlowCalibrationSummaryView的数据上下文的内容? -
将视图模型与视图关联的另一种方法是在视图的构造函数中引用视图模型。然后将视图的数据上下文显式设置为视图模型。
-
FWIW,我通常对所有子视图使用 UserControls,不需要额外的
Frame容器。 -
我们可以看看你的
INotifyPropertyChanged对RaisePropertyChanged的实现吗?与@MikeC 类似,我使用UserControl作为我的视图容器。到目前为止工作完美。 -
另外,您能否验证
FlowCalibrationSummaryView上的 DataContext 是否为空?