[英]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.