以编程方式将绑定设置为DataTemplate

时间:2017-09-21 13:17:58

标签: c# wpf telerik

我正在为重构和现有应用程序编写一个模型,并且我在代码中设置WPF Binding的一些问题......上下文是我的RadPane(来自Telerik套件,RadDocking)控制)我想设置一个标题模板。现在我使用这种方法但是当我停靠窗格时,我得到了标题为System。而不是我得到的内容" System.Windows.Controls.StackPanel"

enter image description here

这是我现有的代码

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

更新1

我必须创建一个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>

1 个答案:

答案 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,它有TopTemplateTitleTemplate个属性,但他们没有提到HeaderTemplate。很多在那里。但它似乎像这样工作。