gpt4 book ai didi

c# - WPF:通过自定义依赖属性绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:42:07 25 4
gpt4 key购买 nike

我有一个 TabControl绑定(bind)到 Dictionary并有一个自定义控件,因为它是 ContentTemplate .自定义控件具有自定义依赖属性 Schedules它是 DataContext绑定(bind)到 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我希望它被绑定(bind)到 SchedulesTabControl 传递, 但同时 MyViewer有一个 ViewModel分配给它。这是 MyViewer 中的样子:
<DataGrid Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=UserControl}, Path=Schedules}" AutoGenerateColumns="False" >

到目前为止,这不起作用,当 MyViewer已加载 Schedules属性是 null .但即使它有效,我也希望将 Schedules 传递给 ViewModel不是后面的代码。一种想法是用 ViewModels 填充字典。的 MyViewer ,但我不想这样做,我只想让主控了解 MyViewer的详细信息.那么有什么好主意可以解决这个问题吗?

编辑:
上面的命题在更改为 ObservableDictionary 后确实有效,但问题仍然存在,如何拥有 SchedulesViewModel

最佳答案

如果 MyViewer有它自己的 ViewModel,你不应该这样做:

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

这边 MyViewer与其他一些控件紧密耦合。

我认为,在这种情况下, MyViewer's ViewModel应该有自己的属性(property) Schedules .你怎么能留着 TabControl ViewModel's SchedulesMyViewer ViewModel's Schedules同步中?这取决于您的系统,但您可以尝试以下想法:
  • 添加或删除项目时,像在 MVVM Light 中一样发送 ViewModel 级别的消息。 Example in this blog post
  • 尝试在 Angular
  • 中实现某种存储,例如在 NgXs 或 NgRx 中
  • 也许您不需要保持计划同步 - 取决于您的系统? :)
  • 关于c# - WPF:通过自定义依赖属性绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55159521/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com