c# - Caliburn.Micro 和 Telerik WPF 控件

标签 c# wpf xaml telerik caliburn.micro

希望你一切都好。

我将 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...这一切都按预期工作。

我错过了什么?

最佳答案

Caliburn 的约定系统仅为开箱即用的 WPF 控件配置。当它看到 RabTabControl 时,它无法识别它,所以它搜索它的类层次结构以寻找它确实识别的东西。在这种情况下,它可能匹配 Selector 或 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);
};

我认为您应该能够获取代码并进行一些小的修改,使其执行您想要的操作。请注意,上面代码中调用的一些方法实际上存在于 ConventionManager 中,因此您需要对其进行修复。您应该在 Bootstrapper 的 Configure 覆盖中添加您的约定。有关这方面的其他示例,请查看 WP7 模板的 Bootstrapper,它定义了 Pivot 和 Panarama 的自定义约定。

关于c# - Caliburn.Micro 和 Telerik WPF 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4113242/

相关文章:

wpf - WPF 和 Silverlight 是否在碰撞过程中?

c# - Entity Framework 6.1 Code First MySql 实体跟踪在上下文中持续存在

c# - 按索引从 IQueryable<anonymous> 列表中获取元素

c# - MVC 应用程序中的 Require.js

c# - 语言资源文件的构造函数在 WPF 中生成为内部构造函数而不是公共(public)构造函数

c# - 如何设置多个viewbox最大的尺寸?

VS2008 Express 中的 WPF 稳定性

c# - WPF/Xaml ContextMenu ItemContainerStyle 行为

c# - MultiBinding - 指定的转换无效

c# - 检查非托管线程中的托管异常