wpf StyleSelector 的型号 "namespacing"?

Model "namespacing" for wpf StyleSelector?

我正在通过调试其测试示例应用程序来学习如何使用 avalonDock。在这个阶段我无法解释的是 "Model" 关键字在某些 xaml 绑定中的存在.

主要是样式选择器,如果去掉,绑定就失效了:

        <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>
  1. MainWindow.xaml
  2. PaneStyleSelector

为什么?我无法弄清楚任何 "Model" 字段或 属性。对于其他示例,它似乎在没有它的情况下也能正常工作:

Microsoft Example

XAML 的好处在于似乎总有一种方法可以通过多种方式做事。当然,这有时也很难超越学习曲线。简而言之,每当你看到 {Binding _______} 就会想到 DataContext

此外,请注意 XAML 中的对象导航类似于在普通 .cs 文件中键入时的 IntelliSense。意思是,如果你有:

public class A { public B b = new B(); }
public class B { public string C; }

然后您可以通过 string s = new A().B.C.

进入 ABC

我的意思是,在 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.

现在的问题是,你如何判断这是否正确?简单的。浏览 DataContext。有很多方法可以做到这一点,而不是调试,或者使用 F12;但这里有一个快速解决问题的方法。

我们知道目标类型是LayoutAnchorableItem:TargetType="{x:Type avalonDock:LayoutAnchorableItem}",所以我们看一下它的source code and look for the Model property. After looking, you don't see it, but you also notice that LayoutAnchorableItem inherits from LayoutItem, which is also our second target type coincidentally. So we look at LayoutItem source code。如您所知,有一个 public object Model 属性。话虽如此,我们可以假设通过一系列事件,我们可以计算出我们的 Model 属性 最终被设置为 FileViewModel 或 [=31= 的实例], 并且都继承自 PaneViewModel.

话虽如此,我们知道 DockingManager 中每个窗格的 DataContextLayoutAnchorableItemLayoutItem,其 Model最终设置为 FileViewModel toolViewModel.

的实例