首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToolBar项DataTemplate绑定RelativeSource搜索找不到父ToolBar

ToolBar项DataTemplate绑定RelativeSource搜索找不到父ToolBar
EN

Stack Overflow用户
提问于 2011-07-14 18:06:08
回答 2查看 1K关注 0票数 0

我有一个ToolBar包含按钮,其中一些按钮只有一个图像的内容,另一些只有文本。我正在尝试将Button的宽度属性绑定到派生的ToolBar类上的一个自定义属性。它有时会工作,但在其他情况下会失败,但会出现以下错误:

System.Windows.Data错误:4:无法找到引用'RelativeSource FindAncestor,AncestorType='NuiWpfCore.Controls.ToolBar',AncestorLevel=‘1’绑定的源代码。BindingExpression:Path=IconSize;DataItem=null;目标元素为“图像”(名称=“”);目标属性为“宽度”(键入“Double”)

下面是包含失败元素绑定的xaml。DataTemplate从内联创建的DataTemplateSelector返回:

代码语言:javascript
复制
<pres:ToolBar x:Class="NuiWpfCore.Controls.ToolBar"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:pres="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:core="clr-namespace:NuiWpfCore"
         xmlns:ctrls="clr-namespace:NuiWpfCore.Controls"
         xmlns:select="clr-namespace:NuiWpfCore.Selectors"
         xmlns:converters="clr-namespace:NuiWpfCore.Converters"
         xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase">

    <ToolBar.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/NuiWpfCore;component/Controls/MenuBarTemplate.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <converters:ListPairToStringConverter x:Key="ListPairToStringConverter" />
            <converters:IconMetaDataToImageConverter x:Key="IconMetaDataToImageConverter" />
            <converters:IconMetaDataToImageConverterParameter x:Key="IconToImageConverterParameter"
                ConvertToImage="False" Width="16" Height="16" />
        </ResourceDictionary>
    </ToolBar.Resources>

    <ToolBar.ItemTemplateSelector>
        <select:ToolBarItemDataTemplateSelector>

            <!-- other DataTemplates omitted for brevity -->

            <select:ToolBarItemDataTemplateSelector.IconCommand>
                <DataTemplate DataType="{x:Type core:PropertyElement}">
                    <Button IsEnabled="{Binding Path=CanEdit}" Command="{Binding}">
                        <Button.Content>
                            <Image 
                                Width="{Binding Path=IconSize, 
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ctrls:ToolBar}} }" 
                                Height="{Binding Path=Width,
                                    RelativeSource={RelativeSource Self}}" 
                                Source="{Binding Path=MetaData, 
                                Converter={StaticResource IconMetaDataToImageConverter},
                                ConverterParameter={StaticResource IconToImageConverterParameter}}"/>
                        </Button.Content>
                    </Button>
                </DataTemplate>
            </select:ToolBarItemDataTemplateSelector.IconCommand>

            <!-- other DataTemplates omitted for brevity -->

        </select:ToolBarItemDataTemplateSelector>
    </ToolBar.ItemTemplateSelector>
</pres:ToolBar>

下面是具有绑定的Source属性的ToolBar类。

代码语言:javascript
复制
public partial class ToolBar : System.Windows.Controls.ToolBar, Views.IView
{
    public ToolBar() : base()
    {
        InitializeComponent();
        IconSize = 32;
    }

    public int IconSize { get; set; }
}

这个ToolBar类有时用于ToolBarTray,有时则不使用,但在某些情况下,绑定搜索在这两种情况下都失败。

有没有人知道为什么这可能会失败?

EN

回答 2

Stack Overflow用户

发布于 2011-07-14 18:58:38

你考虑过把IconSize放在ToolBar上做继承财产吗?

代码语言:javascript
复制
 public static readonly DependencyProperty IconSizeProperty = 
    DependencyProperty.RegisterAttached( "IconSize", typeof(double), typeof(ToolBar ),
        new FrameworkPropertyMetadata(32, FrameworkPropertyMetadataOptions.Inherits));

public static double GetIconSize(DependencyObject target)
{
    return (double)target.GetValue(IconSizeProperty);

}

public static void SetIconSize(DependencyObject target, double value)
{
    target.SetValue(IconSizeProperty, value);
}

然后您就可以访问IconSize了,就像

代码语言:javascript
复制
<Button.Content>
                <Image 
                    Width="{Binding RelativeSource={RelativeSource Self}, ctrls::ToolBar.IconSize}" 
                    Height="{Binding Path=Width,RelativeSource={RelativeSource Self}}" 
                    Source="{Binding Path=MetaData, 
                    Converter={StaticResource IconMetaDataToImageConverter},
                    ConverterParameter={StaticResource IconToImageConverterParameter}}"/>

首先,您应该在工具栏上设置它,树下的每个其他元素都可以访问此属性。

对不起,我没有百分之百地保证是正确的。但是,价值继承的整体理念是解决这一问题的好办法。

票数 0
EN

Stack Overflow用户

发布于 2011-07-14 19:01:50

DataTemplate看起来像是在一个DataTemplateSelector声明中定义的,这个声明不是Visual的一部分,因此如果在那个位置上计算绑定,那么它将无法从那里导航。模板实际应用在哪里?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6697881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档