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>
为什么?我无法弄清楚任何 "Model" 字段或 属性。对于其他示例,它似乎在没有它的情况下也能正常工作:
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
.
进入 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
.
现在的问题是,你如何判断这是否正确?简单的。浏览 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
中每个窗格的 DataContext
是 LayoutAnchorableItem
或 LayoutItem
,其 Model
最终设置为 FileViewModel
或
toolViewModel
.
的实例
我正在通过调试其测试示例应用程序来学习如何使用 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>
为什么?我无法弄清楚任何 "Model" 字段或 属性。对于其他示例,它似乎在没有它的情况下也能正常工作:
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
.
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
.
现在的问题是,你如何判断这是否正确?简单的。浏览 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
中每个窗格的 DataContext
是 LayoutAnchorableItem
或 LayoutItem
,其 Model
最终设置为 FileViewModel
或
toolViewModel
.