簡體   English   中英

Caliburn.Micro和Telerik WPF控制

[英]Caliburn.Micro & Telerik WPF Controls

希望你們都很好。

我正在使用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”(省略號替換完整路徑),而不是應顯示的屏幕。

如果我用<TabControl...替換<telerik:RadTabControl... <TabControl...這一切都按預期工作。

我錯過了什么?

Caliburn的約定系統僅針對開箱即用的WPF控件進行配置。 當它看到RabTabControl時,它無法識別它,所以它搜索它的類層次結構,尋找它確實識別的東西。 在這種情況下,它可能匹配Selector或ItemsControl。 這就是部署公約的原因。 為了獲得您想要的內容,您需要為ConventionManager添加一個適用於RadTabControl的約定,它完全符合您的要求。 以下是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);
};

我認為你應該能夠采取代碼並進行一些小的修改,讓它做你想做的。 請注意,上面代碼中調用的某些方法實際上存在於ConventionManager中,因此您需要修復它。 您應該在Bootstrapper的配置覆蓋中添加您的約定。 有關其他示例,請查看WP7模板的Bootstrapper,它定義了Pivot和Panarama的自定義約定。

Caliburn.Micro.Telerik包含Telerik的WPF控件的約定,以及一些其他Telerik + WPF特定的東西,如IWindowManager實現和兩個帶示例的應用程序。

您可以查看源代碼nuget包

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;
};

希望這可以幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM