2016-08-09 89 views
0

Ich versuche, WPF zu lernen und scheint einen Fehler zu bekommen, den ich wirklich nicht vollständig verstehe.Kann nicht finden, Quelle für die Bindung mit Verweis mit RibbonComboBox

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Ribbon.RibbonWindow', AncestorLevel='1''. BindingExpression:Path=WindowState; DataItem=null; target element is 'Ribbon' (Name=''); target property is 'NoTarget' (type 'Object') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Ribbon.RibbonWindow', AncestorLevel='1''. BindingExpression:Path=IsActive; DataItem=null; target element is 'Ribbon' (Name=''); target property is 'NoTarget' (type 'Object') 

Hier ein Abschnitt meines XAML. Ich kann nicht sagen, ob die Fehler gerade begonnen haben, aber ich habe Code optimiert, der mit den zwei RibbonComboBoxe es unter der Home Header funktioniert. (Das <Ribbon> Element ist in einem <Grid> Element.)

Kann mir jemand helfen, dieses Problem zu lösen? Der Code verhält sich nicht ganz korrekt und ich kann nicht sagen, ob dieser Fehler damit zusammenhängt.

<Ribbon> 
    <Ribbon.ApplicationMenu> 
     <RibbonApplicationMenu> 
      <RibbonApplicationMenuItem Header="_Preview" ImageSource="Images/preview.png"></RibbonApplicationMenuItem> 
      <RibbonSeparator></RibbonSeparator> 
      <RibbonApplicationMenuItem Name="Save" KeyTip="S" Header="_Save" ImageSource="Images/save.png" ToolTipTitle="Save" ToolTipDescription="Save the current article and keep editing" Click="Save_Click"></RibbonApplicationMenuItem> 
      <RibbonSeparator></RibbonSeparator> 
      <RibbonApplicationMenuItem Name="SaveAndExit" KeyTip="X" Header="Save and E_xit" ToolTipTitle="Save and Exit" ToolTipDescription="Save the current article and close window" Click="SaveAndExit_Click"></RibbonApplicationMenuItem> 
      <RibbonApplicationMenuItem Name="AbortAndExit" Header="_Abort Edit" ToolTipTitle="Abort Edit" ToolTipDescription="Close window without saving changes to this article" Click="AbortAndExit_Click"></RibbonApplicationMenuItem> 
     </RibbonApplicationMenu> 
    </Ribbon.ApplicationMenu> 
    <RibbonTab Header="Home"> 
     <RibbonGroup Header="Category"> 
      <RibbonComboBox Label="Category:" SelectionBoxWidth="250"> 
       <RibbonGallery SelectedItem="{Binding Path=Categories.SelectedItem}"> 
        <RibbonGalleryCategory IsSharedColumnSizeScope="True" DisplayMemberPath="Text" ItemsSource="{Binding Path=Categories.Items}"> 
        </RibbonGalleryCategory> 
       </RibbonGallery> 
      </RibbonComboBox> 
      <RibbonComboBox Label="Subcategory:" SelectionBoxWidth="250"> 
       <RibbonGallery SelectedItem="{Binding Path=Subcategories.SelectedItem}"> 
        <RibbonGalleryCategory IsSharedColumnSizeScope="True" ColumnsStretchToFill="True" MaxColumnCount="1" DisplayMemberPath="Text" ItemsSource="{Binding Path=Subcategories.Items}"> 
        </RibbonGalleryCategory> 
       </RibbonGallery> 
      </RibbonComboBox> 
      <RibbonButton Label="Edit Categories" Command="local:EditCommands.Categories" SmallImageSource="Images\categories_sm.png" ToolTipTitle="Edit Categories" ToolTipDescription="Add, edit or delete categories and subcategories" ToolTipImageSource="Images\categories_sm.png"></RibbonButton> 
     </RibbonGroup> 
     <RibbonGroup Header="Author"> 
      <RibbonTwoLineText Text="[email protected]"></RibbonTwoLineText> 
      <RibbonButton Label="Set Author" Command="local:EditCommands.Header1" SmallImageSource="Images\h1_sm.png" ToolTipTitle="Header 1" ToolTipDescription="Format selected text as a level 1 header" ToolTipImageSource="Images\h1.png"></RibbonButton> 
     </RibbonGroup> 
     <RibbonGroup Header="Settings"> 
      <RibbonCheckBox Name="chkApproved" Label="Approved"></RibbonCheckBox> 
      <RibbonCheckBox Name="chkDeprecated" Label="Deprecated"></RibbonCheckBox> 
      <RibbonButton Name="btnMetadata" Label="Metadata" SmallImageSource="Images\metadata_sm.png" ToolTipTitle="Metadata" ToolTipDescription="Edit article metadata" ToolTipImageSource="Images\metadata.png" Click="btnMetadata_Click"></RibbonButton> 
     </RibbonGroup> 
     <RibbonGroup Header="History"> 
      <RibbonButton Label="Edit Updates" Command="local:EditCommands.EditHistory" SmallImageSource="Images\history_sm.png" LargeImageSource="Images\history.png" ToolTipTitle="Edit Updates" ToolTipDescription="Edit update history for this article"></RibbonButton> 
     </RibbonGroup> 
    </RibbonTab> 

UPDATE:

Basierend auf IlVic Antwort, änderte ich meine Window zu einem RibbonWindow. Aber dann bekomme ich den folgenden Fehler.

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'RibbonGalleryItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment') 

Antwort

1

Ihr Problem wird durch Ihre Kontrolle verursacht. Wenn Sie einen Blick auf den Standardstil nehmen (können Sie ILSpy verwenden), finden Sie diese MultiDataTrigger:

<rd:MultiDataTrigger> 
    <rd:MultiDataTrigger.Conditions> 
     <rd:Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ribbon:RibbonWindow}, Path=IsActive}" Value="False" /> 
     <rd:Condition Binding="{Binding Path=(SystemParameters.IsGlassEnabled)}" Value="False" /> 
     <rd:Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsHostedInRibbonWindow}" Value="True" /> 
    </rd:MultiDataTrigger.Conditions> 
    <rd:Setter TargetName="PART_TitleHost" Value="{windows:DynamicResource {x:Static SystemColors.InactiveCaptionTextBrushKey}}" Property="TextElement.Foreground" /> 
</rd:MultiDataTrigger> 

Wie Sie seine erste Bedingung sehen sucht nach einem Vorfahren, deren Typ RibbonWindow. Sie werden leicht eine andere MultiDataTrigger finden, die als eine Bedingung, die nach WindowState Eigenschaft einer RibbonWindow Kontrolle auch sucht.

Ich vermute, dass Ihr XAML in einem normalen Fenster ist. So müssen Sie das Window Objekt mit einem RibbonWindow ein, etwas zu ersetzen, wie:

<rib:RibbonWindow 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:rib="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     x:Class="[yourWindowClassName]"> 
    <!-- Put your Ribbon Control somewhere here --> 
</rib:RibbonWindow> 

Ich hoffe, es hilft.

+0

Danke, ich wusste nicht, dass ich das brauchte. Ich muss noch einiges über WPF und XAML lernen. Ich habe Ihre Antwort als die richtige markiert, aber wenn es Ihnen nichts ausmacht, einen Blick darauf zu werfen, bekomme ich jetzt einen ähnlichen, aber anderen Fehler nach der Änderung. Ist 'RibbonGalleryItem' ein Element, das ich _must_ manuell zu meinem XAML hinzufügen muss? –

+0

Es tut mir leid @ JonathanWood, aber ich bin nicht in der Lage, Ihre zweite Ausgabe zu reproduzieren. Wahrscheinlich sollten Sie weitere Details zu Ihrem XAML und Ihrem Code hinzufügen (vielleicht können Sie darüber nachdenken, eine neue Frage zu stellen). –