我正在学习如何通过调试测试样本应用程序来使用avalonDock。我在这个阶段无法解释的是在某些xaml绑定中存在 “Model” 关键字。
主要在样式选择器中,如果删除它,绑定将不再起作用:
<avalonDock:DockingManager.LayoutItemContainerStyleSelector>
<local:PanesStyleSelector>
<local:PanesStyleSelector.ToolStyle>
<Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
<Setter Property="Title" Value="{Binding Model.Title}"/>
<Setter Property="IconSource" Value="{Binding Model.IconSource}"/>
<Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter={x:Static Visibility.Hidden}}"/>
<Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
<Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/>
<Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>
</Style>
</local:PanesStyleSelector.ToolStyle>
<local:PanesStyleSelector.FileStyle>
<Style TargetType="{x:Type avalonDock:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Title}"/>
<Setter Property="ToolTip" Value="{Binding Model.FilePath}"/>
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}"/>
<Setter Property="IconSource" Value="{Binding Model.IconSource}"/>
<Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
</Style>
</local:PanesStyleSelector.FileStyle>
</local:PanesStyleSelector>
</avalonDock:DockingManager.LayoutItemContainerStyleSelector>
为什么?我无法找出任何“模型”字段或属性。它似乎没有它用于其他例子:
答案 0 :(得分:2)
关于XAML的好处是,似乎总有很多方法可以做事。当然,这有时也很难超越学习曲线。简而言之,只要您看到{Binding _______}
认为DataContext
。
另外,知道在键入普通.cs
文件时,XAML中的对象导航类似于IntelliSense。意思是,如果你有:
public class A { public B b = new B(); }
public class B { public string C; }
然后您可以通过A
转到B
C
string s = new A().B.C
。
我所得到的是,在XAML中,这三个是相同的:
<Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
<Setter Property="Title" Value="{Binding Title, Path=Model}"/>
...
<local:PanesStyleSelector.ToolStyle>
<Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
<Setter Property="DataContext" Value="{Binding Model}" />
<Setter Property="Title" Value="{Binding Title}"/>
...
<!-- What you currently have -->
<Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
<Setter Property="Title" Value="{Binding Model.Title}"/>
...
实际上,Model
是控件要在其DataContext
中查找的属性,它将绑定到属于Model
的Title属性。< / p>
现在的问题是,你怎么知道这是否正确?简单。浏览DataContext
。您可以通过多种方式执行此操作,而不是进行调试,或使用F12
;但这是一个快速解决问题的方法。
我们知道目标类型是LayoutAnchorableItem:TargetType="{x:Type avalonDock:LayoutAnchorableItem}"
,因此我们查看其source code并查找Model属性。在查看之后,您看不到它,但您也注意到LayoutAnchorableItem
继承自LayoutItem
,这也是我们的第二个目标类型。我们来看看LayoutItem
source code。如您所知,有一个public object Model
属性。话虽如此,我们可以假设通过一系列事件,我们可以确定我们的Model
属性最终设置为FileViewModel
或ToolViewModel
的实例,并且继承自PaneViewModel
。
话虽如此,我们知道DataContext
中每个窗格的DockingManager
是LayoutAnchorableItem
或LayoutItem
,其Model
最终设置为FileViewModel
或
toolViewModel
的实例。