代码之家  ›  专栏  ›  技术社区  ›  Dan

Caliburn.Micro&Telerik WPF控件

  •  8
  • Dan  · 技术社区  · 15 年前

    我使用Caliburn.Micro和Telerik的WPF控件来构建一个选项卡式界面。使用RadTabControl我有以下代码;

    <telerik:RadTabControl x:Name="Items" Grid.Row="1" TabStripPlacement="Bottom">
        <telerik:RadTabControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding DisplayIcon}" Width="16" Height="16"/>
                    <TextBlock Text="{Binding DisplayName}"/>
                </StackPanel>
            </DataTemplate>
        </telerik:RadTabControl.ItemTemplate>
    </telerik:RadTabControl>
    

    选项卡的标题正确,但内容为“../MyViewModel”(省略号替换完整路径),而不是应显示的屏幕。

    如果我换了 <telerik:RadTabControl... 具有 <TabControl...

    我错过了什么?

    2 回复  |  直到 15 年前
        1
  •  12
  •   EisenbergEffect    15 年前

    Caliburn的约定系统只为开箱即用的WPF控件配置。当它看到RabTabControl时,它不识别它,所以它搜索它的类层次结构,寻找它确实识别的东西。在本例中,它可能与选择器或ItemsControl匹配。这就是为什么部分应用约定的原因。为了得到您想要的内容,您需要在RadTabControl的ConventionManager中添加一个约定,该约定正好满足您的需要。下面是如何定义TabControl约定的:

    AddElementConvention<TabControl>(TabControl.ItemsSourceProperty, "ItemsSource", "SelectionChanged")
    .ApplyBinding = (viewModelType, path, property, element, convention) => {
        if(!SetBinding(viewModelType, path, property, element, convention))
            return;
    
        var tabControl = (TabControl)element;
        if(tabControl.ContentTemplate == null && tabControl.ContentTemplateSelector == null && property.PropertyType.IsGenericType) {
            var itemType = property.PropertyType.GetGenericArguments().First();
            if(!itemType.IsValueType && !typeof(string).IsAssignableFrom(itemType))
                tabControl.ContentTemplate = DefaultItemTemplate;
        }
    
        ConfigureSelectedItem(element, Selector.SelectedItemProperty, viewModelType, path);
    
        if(string.IsNullOrEmpty(tabControl.DisplayMemberPath))
            ApplyHeaderTemplate(tabControl, TabControl.ItemTemplateProperty, viewModelType);
    };
    

    我认为您应该能够接受代码,并通过一些小的修改,使它做您想要的。注意,上面代码中调用的一些方法实际上存在于常规管理器上,因此您需要修复它。您应该在引导程序的配置覆盖中添加约定。关于这个示例的另一个例子,请查看WP7模板的引导程序,它定义了Pivot和Panarama的自定义约定。

        2
  •  4
  •   Valeriu Caraulean    14 年前

    你可以看看 source code 或者 nuget package

    RadTabControl的约定如下:

    ConventionManager.AddElementConvention<RadTabControl>(RadTabControl.ItemsSourceProperty,
                                                      "ItemsSource",
                                                      "SelectionChanged")
    .ApplyBinding = (viewModelType, path, property, element, convention) =>
    {
        if (!ConventionManager.SetBindingWithoutBindingOrValueOverwrite(viewModelType,
                                                                        path,
                                                                        property,
                                                                        element,
                                                                        convention,
                                                                        RadTabControl.ItemsSourceProperty))
            return false;
    
        var tabControl = (RadTabControl) element;
        if (tabControl.ContentTemplate == null
            && tabControl.ContentTemplateSelector == null
            && property.PropertyType.IsGenericType)
        {
            var itemType = property.PropertyType.GetGenericArguments().First();
            if (!itemType.IsValueType && !typeof (string).IsAssignableFrom(itemType))
                tabControl.ContentTemplate = ConventionManager.DefaultItemTemplate;
        }
        ConventionManager.ConfigureSelectedItem(element,
                                                RadTabControl.SelectedItemProperty,
                                                viewModelType,
                                                path);
    
        if (string.IsNullOrEmpty(tabControl.DisplayMemberPath))
            ConventionManager.ApplyHeaderTemplate(tabControl,
                                                  RadTabControl.ItemTemplateProperty,
                                                  RadTabControl.ItemTemplateSelectorProperty,
                                                  viewModelType);
        return true;
    };
    

    希望这有帮助。。。

    推荐文章