[英]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实现和两个带示例的应用程序。
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.