【发布时间】:2019-03-14 09:57:04
【问题描述】:
我有一个TabControl 绑定到一个Dictionary 并且有一个自定义控件,因为它是ContentTemplate。自定义控件有一个自定义依赖属性Schedules,它的DataContext 绑定到ViewModel,如下所示:
主控:
<TabControl Grid.Row="1" ItemsSource="{Binding Schedules}">
<TabControl.ContentTemplate>
<DataTemplate>
<TabControl >
<TabItem Header="Scheduled flights">
<views:MyViewer Schedules="{Binding Value}"/>
</TabItem>
</TabControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
在MyViewer 中,我还有一个DataGrid,我希望它绑定从TabControl 传递的Schedules,但同时MyViewer 有一个ViewModel 分配给它。这是MyViewer中的样子:
<DataGrid Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=Schedules}" AutoGenerateColumns="False" >
到目前为止,这不起作用,当 MyViewer 加载时 Schedules 属性是 null。但即使它有效,我也希望将时间表传递给 ViewModel 而不是后面的代码。一个想法是用MyViewer 的ViewModels 填充字典,但我不想这样做,我只希望主控件知道MyViewer 的详细信息。那么有什么好主意可以解决这个问题吗?
编辑:
上面的命题在更改为ObservableDictionary 后确实有效,但问题仍然存在,如何在ViewModel 中拥有Schedules
【问题讨论】:
-
你可以使用 tag 属性。将 Schedules 绑定到 Tag(您可能需要一个转换器)并将 TabControl.Tag 属性设置/绑定到您希望 Schedules 成为的值。否则,您将需要创建一个具有 schedules 属性和 tabcontrol 逻辑的自定义控件
-
所以
DataGrid没有绑定到MyViewer的Schedules属性?您确定该属性已设置,即绑定到Value确实有效吗? -
@mm8,它确实在对字典进行了一些修改后绑定,但我仍然希望在
ViewModel中有时间表,你有什么建议? -
@Ayoub.A:将
DataGrid直接绑定到Value? -
@mm8,这就是我想要的,将 Value 传递给 MyViewer 的 ViewModel。你是怎么做到的?