我们有一个UI布局,可为ItemsControl
创建一个Expander列表。
ItemsControl
被命名为Items,并且按照惯例成功绑定到我们的视图模型内部列表,其中我们的视图模型类型为Conductor<SubViewModel>.Collection.OneActive
我的SubViewModel
是Screen
,看起来像这样:
public class SubViewModel : Screen, ISubViewModel
{
public bool IsVisible => true;
public string GroupName => "MyGroupName";
public bool HasValidationFailures => true;
protected override void OnViewLoaded(object view)
{
//overridden to breakpoint on to see when the views get hooked up
}
//various properties and other viewModelly things which should be unimportant
}
ItemsControl
当前正确地为“项目”列表中的每个子视图模型创建了一个Expander
,并且扩展器的内容还可以通过以下Xaml正确地找到正确的视图:
<ItemsControl x:Name="Items">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:SubViewModel">
<Expander Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
cal:View.ApplyConventions="True"
cal:View.Model="{Binding}">
<Expander.Header>
<WrapPanel>
<TextBlock Text="{Binding GroupName}" />
<ContentControl Style="{StaticResource ErrorIndicator}"
Visibility="{Binding HasValidationFailures, Converter={StaticResource BooleanToVisibilityConverter}}" />
</WrapPanel>
</Expander.Header>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这是为了方便用户配置不同的布局。例如,我们当前将同一指挥家绑定到使用TabControl
的不同视图,并允许在单独的选项卡中显示组。
选项卡控件还只有在选择选项卡后,才能正确绑定视图。
经过大量的在线研究,我很确定我想要一个ElementConvention
,但是我很难确定我需要做些什么来使惯例甚至被称为Expander
。我遵循了一些在网上找到的示例,并编写了以下代码来尝试执行公约:
ConventionManager.AddElementConvention<Expander>(Expander.IsExpandedProperty, "IsExpanded", "IsExpandedChanged")
.ApplyBinding = (viewModelType, path, property, element, convention) =>
{
return true;
};
但是,如果我在此Funcs主体上设置断点,它将永远不会被击中,并且所有视图都与Expander
的创建挂钩,这就是为什么我没有投入任何逻辑来检查{{1} }已展开...
我还尝试通过将Expander
设置在扩展器上来强制执行此操作……这是实验性的,但出于完整性考虑,在我的Xaml中显示。
我很高兴探索不是“自定义元素约定”的其他路线,但我并没有发现太多让我相信应该以不同方式进行的路线。