我正在为重构和现有应用程序编写一个模型,并且我在代码中设置WPF Binding的一些问题......上下文是我的RadPane(来自Telerik套件,RadDocking)控制)我想设置一个标题模板。现在我使用这种方法但是当我停靠窗格时,我得到了标题为System。而不是我得到的内容" System.Windows.Controls.StackPanel"
这是我现有的代码
var pane = new RadDocumentPane();
var view = CreateViewContent(viewModel);
pane.DataContext = ((IView)view).DataContext;
pane.Content = view;
var dataTemplate = (DataTemplate)Application.Current.Resources["Default"];
var x = (StackPanel) dataTemplate.LoadContent();
x.DataContext = ((IView)view).DataContext;
pane.Header=x;
pane.Title=x;
我想要的东西是
Binding binding = new Binding("?????");
BindingOperations.SetBinding(pane, HeaderedContentControl.HeaderTemplateProperty, binding);
但我不知道如何告诉绑定我想引用dataTemplate
我必须创建一个DataTemplate的原因是我要添加一些这里定义的上下文菜单功能
<DataTemplate x:Key="Default">
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding Title,Mode=OneWay, UpdateSourceTrigger=Default}" Margin="3,0,0,0" >
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu x:Name="ContextMenu">
<telerik:RadMenuItem Header="Chiudi questo">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<catel:EventToCommand Command="{Binding CloseCommand, Source={StaticResource PaneCommands}}" CommandParameter="{Binding}" DisableAssociatedObjectOnCannotExecute="False" />
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadMenuItem>
<telerik:RadMenuItem Header="Chiudi tutti">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<catel:EventToCommand Command="{Binding CloseAllCommand, Source={StaticResource PaneCommands}}" CommandParameter="{Binding}" DisableAssociatedObjectOnCannotExecute="False" />
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadMenuItem>
<telerik:RadMenuItem Header="Chiudi tutti tranne questo">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<catel:EventToCommand Command="{Binding CloseAllExceptThisCommand, Source={StaticResource PaneCommands}}" CommandParameter="{Binding}" DisableAssociatedObjectOnCannotExecute="False" />
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadMenuItem>
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<catel:EventToCommand Command="{Binding MouseDownCommand, Source={StaticResource PaneCommands}}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBlock>
</StackPanel>
</DataTemplate>
答案 0 :(得分:1)
标题模板告诉控件如何显示为Header
提供的对象。如果Header
只是一个字符串而您只是希望它显示为普通的UI文本,那么您就不必费心去模板了。同样,如果Header
是一个控件。但如果你遇到编写标题DataTemplate
的麻烦,我想你有理由这样做。
所以只需给它模板:
pane.HeaderTemplate = dataTemplate;
现在,我不知道你的模板是做什么的,或者你为什么写了一个,或者视图中的DataContext
(应该是一个视图模型,但实际上它可能是字面上的任何东西)。
但我的猜测是,您希望将其用作标题模板的DataContext
,并且它应该是它应该是什么。如果是这种情况,您需要设置实际的标题内容,如下所示:
pane.Header = ((IView)view).DataContext;
...即,除非((IView)view).DataContext
可能在运行时发生变化。这可能发生,而这是什么绑定。然后你就这样做了。
pane.SetBinding(
HeaderedContentControl.HeaderProperty,
new Binding("DataContext") { Source = view });
查看the documentation for RadDocumentPane
,它有TopTemplate
和TitleTemplate
个属性,但他们没有提到HeaderTemplate
。很多在那里。但它似乎像这样工作。