延迟视图分辨率,直到展开扩展器

时间:2018-09-26 10:28:24

标签: c# xaml caliburn.micro

我们有一个UI布局,可为ItemsControl创建一个Expander列表。 ItemsControl被命名为Items,并且按照惯例成功绑定到我们的视图模型内部列表,其中我们的视图模型类型为Conductor<SubViewModel>.Collection.OneActive

我的SubViewModelScreen,看起来像这样:

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中显示。

我很高兴探索不是“自定义元素约定”的其他路线,但我并没有发现太多让我相信应该以不同方式进行的路线。

0 个答案:

没有答案