为wpf StyleSelector建模“命名空间”?

时间:2015-04-16 13:55:45

标签: wpf xaml avalondock

我正在学习如何通过调试测试样本应用程序来使用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>
  1. MainWindow.xaml
  2. PaneStyleSelector
  3. 为什么?我无法找出任何“模型”字段或属性。它似乎没有它用于其他例子:

    Microsoft Example

1 个答案:

答案 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属性最终设置为FileViewModelToolViewModel的实例,并且继承自PaneViewModel

话虽如此,我们知道DataContext中每个窗格的DockingManagerLayoutAnchorableItemLayoutItem,其Model最终设置为FileViewModel toolViewModel的实例。