2011-07-14 21 views
0

を見つけることができなかっRelativeSource検索を結合、ボタンのいくつかは、コンテンツのための画像のみを持って、他の人がテキストのみを持っています。 Button Imageのwidthプロパティを、派生したToolBarクラスのカスタムプロパティにバインドしようとしています。それは時々動作しますが、次のエラーで他の回失敗:ツールバー項目のDataTemplateが、私はボタンを含むツールバーを持つ親のツールバー

System.Windows.Dataエラー:4:「RelativeSource FindAncestor、AncestorType =」参照してバインディングのソースを見つけることができませんNuiWpfCore.Controls.ToolBar「AncestorLevel =」 1 ''。 BindingExpression:Path = IconSize; DataItem = null;ターゲット要素は 'Image'(Name = '')です。ターゲットプロパティは '幅'(タイプ 'Double')です。

ここには、失敗している要素バインディングを含むxamlがあります。 DataTemplateをインラインで作成されDataTemplateSelectorから返されます。ここでは

<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> 

は、バインディングのソースプロパティを持つツールバークラスです。

public partial class ToolBar : System.Windows.Controls.ToolBar, Views.IView 
{ 
    public ToolBar() : base() 
    { 
     InitializeComponent(); 
     IconSize = 32; 
    } 

    public int IconSize { get; set; } 
} 

このツールバークラスは、時にはToolBarTray、それはありませんが、バインド、検索が特定のシナリオでは、両方のケースで失敗し、他の回で使用されています。

誰もが、これは失敗する可能性がある理由を任意のアイデアを持っていますか?

答えて

0

はあなたのツールバーinherited propertyIconSizeを作ると考えたことがありますか?

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); 
} 

次に、あなただけの

<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}}"/> 

まず、あなたのツールバー上に設定する必要があり、そしてツリーの下、他のすべての要素がこのプロパティにアクセスできるようにIconSizeにアクセスすることができます。

私の頭のうち申し訳ありませんが、100%正しいことをguarenteedありません。しかし、 値継承の全体的な考え方は、これを解決する良い方法です。

0

DataTemplateは、Visual Treeの一部ではないDataTemplateSelector宣言内で定義されているように見えるため、その場所でBindingが評価されていれば、そこから上に移動することはできません。テンプレートは実際にどこに適用されていますか?

+0

私は、テンプレートセレクタが適用されている場所を示すために、ファイルのほとんどが含まれるようにXAMLを更新しました。 – Hank

+0

そこにあるものに基づいて、すべてが機能しているはずです。テンプレートは各アイテムに適用され、ToolBarのItemsPresenterの下のツリーに配置されます。私はあなたがそのイメージがレンダリングされている場所を正確に見ることができますし、なぜそれが親ツールバーに得ることができないので、ランタイムビジュアルツリーを見てスヌープを使用してお勧めします。 –

関連する問題