WPF:通过自定义依赖项属性进行绑定

时间:2019-03-14 09:57:04

标签: c# wpf mvvm binding

我有一个绑定到TabControl的{​​{1}},并且有一个自定义控件,例如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传递的Schedules,但同时{{1} }分配了TabControl。在MyViewer中是这样的:

ViewModel

到目前为止,当加载MyViewer的{​​{1}}属性为<DataGrid Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=Schedules}" AutoGenerateColumns="False" > 时,此方法不起作用。但是,即使可行,我也希望将日程表传递到MyViewer而不在后面编写代码。一个想法是用Schedules的{​​{1}}填充Dictionary,但是我不想这样做,我只希望Main控件知道null的细节。那么有什么好主意解决这个问题吗?

编辑: 上面的命题在更改为ViewModel后确实有效,但是问题仍然是,如何在ViewModels中包含MyViewer

1 个答案:

答案 0 :(得分:0)

如果MyViewer拥有自己的ViewModel,则您不应该这样做:

   ItemsSource="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, 
   AncestorType=UserControl}, Path=Schedules}"

通过这种方式MyViewer与其他控件紧密耦合。

我认为,在这种情况下,MyViewer's ViewModel应该拥有自己的财产Schedules。您如何使TabControl ViewModel's SchedulesMyViewer ViewModel's Schedules保持同步?这取决于您的系统,但是您可以尝试以下方法:

  • 添加或删除项目时,发送MVVM Light中的ViewModel级消息。 Example in this blog post
  • 尝试在Angular中实现某种存储,例如NgXs或NgRx
  • 也许您不需要保持时间表同步-取决于您的系统? :)