2010-11-25 10 views
5

WPF RibbonControl (2010 년 10 월 버전)을 사용하여 작은 문제가 발생했습니다. 내 생각은 RibbonGroup의 ItemsSource 속성을 내 viewmodel에 바인딩하고 DataTemplate을 사용하여 필요에 따라 RibbonButton을 만드는 것이 었습니다. 이것은 작동하지만 창 보여줄 때 (각 버튼에 대해 하나) 바인딩 오류가 발생합니다 :WPF 리본 : DataTemplate이 BindingExpression 경로 오류를 발생시킵니다.

여기 System.Windows.Data Error: 40 : BindingExpression path error: 'IsDropDownOpen' property not found on 'object' ''RibbonContentPresenter' (Name='PART_ContentPresenter')'. BindingExpression:Path=IsDropDownOpen; DataItem='RibbonContentPresenter' (Name='PART_ContentPresenter'); target element is 'RibbonButton' (Name=''); target property is 'NoTarget' (type 'Object')

는 뷰 모델은 문자열 배열로 대체, 코드 조각이다,하지만 문제는 동일 :

<ribbon:RibbonWindow x:Class="WpfRibbonApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" x:Name="RibbonWindow" Width="640" Height="480" > 

    <ribbon:RibbonWindow.Resources> 
     <x:Array x:Key="buttonArray" Type="sys:String"> 
      <sys:String>Button 1</sys:String> 
      <sys:String>Button 2</sys:String> 
      <sys:String>Button 3</sys:String> 
      <sys:String>Button 4</sys:String> 
      <sys:String>Button 5</sys:String> 
      <sys:String>Button 6</sys:String> 
     </x:Array> 
     <DataTemplate x:Key="buttonTemplate"> 
      <ribbon:RibbonButton Label="{Binding}" /> 
     </DataTemplate>   
    </ribbon:RibbonWindow.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <ribbon:Ribbon> 
      <ribbon:RibbonTab Header="Tab1"> 
       <ribbon:RibbonGroup Header="Group1" 
        ItemsSource="{StaticResource buttonArray}" 
        ItemTemplate="{StaticResource buttonTemplate}" 
       /> 
      </ribbon:RibbonTab> 
     </ribbon:Ribbon>   
    </Grid> 
</ribbon:RibbonWindow> 

다시 작동하지만 바인딩 오류는 약간 성가시다. 그것을 제거 할 수있는 방법이 있습니까?

답변

3

바인딩 오류는 RibbonControlsLibrary 내의 RibbonButton에 대한 컨트롤 템플릿에 있습니다. 스타일에는 다음과 같은 MultiDataTrigger가 정의되어 있으며, RibbonSplitButton과 같은 다른 컨트롤의 일부로 RibbonButton이 사용될 때 사용됩니다. 이 바인딩 오류가 발생하지 않습니다 :

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsDropDownOpen}" Value="True" /> 
     <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False" /> 
     <Condition Binding="{Binding Path=HighContrast, Source={x:Static shell:SystemParameters2.Current}}" Value="True" /> 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="OuterBorder" Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
</MultiDataTrigger> 
+0

리본 단추에 대한 사용자 지정 컨트롤 템플릿을 만드는 것이 트릭을 만들었습니다. – janemann

1

나는 아래로의 ControlTemplate에와 MultiDataTrigger없이 RibbonButton 스타일 하였다.

<ribbon:RibbonWindow.Resources> 

    <ControlTemplate x:Key="RibbonButtonTemplate" TargetType="{x:Type ribbon:RibbonButton}"> 
     <Grid x:Name="MainGrid" SnapsToDevicePixels="True"> 

      <Border x:Name="OuterBorder" 
       CornerRadius="{TemplateBinding CornerRadius}" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       Margin="1,1,1,1"/> 

      <Border x:Name="MiddleBorder" 
       CornerRadius="{TemplateBinding CornerRadius}" 
       Background="Transparent" 
       BorderBrush="Transparent" 
       BorderThickness="{TemplateBinding BorderThickness}" > 
       <Border x:Name="InnerBorder" 
        Background="Transparent" 
        BorderBrush="Transparent" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Padding="{TemplateBinding Padding}" 
        CornerRadius="{TemplateBinding CornerRadius}"> 
        <StackPanel x:Name="StackPanel" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 

         <Image x:Name="PART_Image" 
          Source="{TemplateBinding LargeImageSource}" 
          Margin="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type ribbon:Ribbon}, 
          ResourceId=LargeImageMargin}}" 
          RenderOptions.BitmapScalingMode="NearestNeighbor" 
          VerticalAlignment="Center" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" /> 

         <Grid x:Name="GridText" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center"> 

          <ribbon:RibbonTwoLineText x:Name="TwoLineText" 
            Text="{TemplateBinding Label}" 
            TextAlignment="Center" 
            VerticalAlignment="Top" 
            HorizontalAlignment="Center" 
            LineHeight="13px" 
            LineStackingStrategy="BlockLineHeight" 
            HasTwoLines="{TemplateBinding ribbon:RibbonTwoLineText.HasTwoLines}" 
            PathData="{TemplateBinding ribbon:RibbonTwoLineText.PathData}" 
            PathFill="{TemplateBinding Foreground}" 
            Margin="1,1,1,0" /> 
         </Grid> 
        </StackPanel> 
       </Border> 
      </Border> 


     </Grid> 

     <ControlTemplate.Triggers> 

      <!-- Large Variant --> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ControlSizeDefinition.ImageSize}" Value="Large"> 
       <Setter Property="MinWidth" Value="44"/> 
       <Setter Property="Height" Value="66"/> 
       <Setter TargetName="GridText" Property="MinHeight" Value="26" /> 
       <Setter TargetName="TwoLineText" Property="HasTwoLines" Value="True" /> 
      </DataTrigger> 

      <!-- Medium or Small Variant --> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ControlSizeDefinition.ImageSize}" Value="Small"> 
       <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SmallImageSource}"/> 
       <Setter TargetName="StackPanel" Property="HorizontalAlignment" Value="Left" /> 

       <Setter TargetName="PART_Image" Property="Margin" Value="2,2,2,2" /> 
       <Setter TargetName="PART_Image" Property="Source" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SmallImageSource}" /> 
       <Setter TargetName="PART_Image" Property="Width" Value="16" /> 
       <Setter TargetName="PART_Image" Property="Height" Value="16" /> 
       <Setter TargetName="PART_Image" Property="HorizontalAlignment" Value="Left" /> 

       <Setter TargetName="TwoLineText" Property="HorizontalAlignment" Value="Left" /> 
       <Setter TargetName="TwoLineText" Property="Margin" Value="1" /> 
       <Setter TargetName="StackPanel" Property="Orientation" Value="Horizontal" /> 
      </DataTrigger> 


      <!-- IsMouseOver --> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter TargetName="OuterBorder" Property="Background" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MouseOverBackground}" /> 
       <Setter TargetName="OuterBorder" Property="BorderBrush" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MouseOverBorderBrush}" /> 
       <Setter TargetName="InnerBorder" Property="BorderBrush" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FocusedBorderBrush}" /> 
      </Trigger> 

      <!-- IsFocused --> 
      <Trigger Property="IsKeyboardFocused" Value="True"> 
       <Setter TargetName="OuterBorder" Property="Background" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FocusedBackground}" /> 
       <Setter TargetName="OuterBorder" Property="BorderBrush" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FocusedBorderBrush}" /> 
       <Setter TargetName="InnerBorder" Property="BorderBrush" 
         Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FocusedBorderBrush}"/> 
      </Trigger> 

     </ControlTemplate.Triggers> 
    </ControlTemplate> 

    <Style x:Key="RibbonButtonStyle" TargetType="{x:Type ribbon:RibbonButton}" > 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="BorderBrush" Value="Transparent" /> 
     <Setter Property="BorderThickness" Value="1" /> 
     <Setter Property="CornerRadius" Value="2" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
     <Setter Property="HorizontalContentAlignment" Value="Center" /> 
     <Setter Property="VerticalContentAlignment" Value="Center" /> 
     <Setter Property="MouseOverBorderBrush" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.MouseOverBorderBrush}" /> 
     <Setter Property="MouseOverBackground" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.MouseOverBackground}" /> 
     <Setter Property="PressedBorderBrush" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.PressedBorderBrush}" /> 
     <Setter Property="PressedBackground" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.PressedBackground}" /> 
     <Setter Property="FocusedBorderBrush" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.FocusedBorderBrush}" /> 
     <Setter Property="FocusedBackground" Value="{Binding RelativeSource={RelativeSource Self},Path=Ribbon.FocusedBackground}" /> 
     <Setter Property="Template" Value="{StaticResource RibbonButtonTemplate}" /> 
     <Setter Property="QuickAccessToolBarControlSizeDefinition"> 
      <Setter.Value> 
       <ribbon:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="False" /> 
      </Setter.Value> 
     </Setter> 

    </Style> 

    <x:Array x:Key="buttonArray" Type="sys:String"> 
     <sys:String>Button 1</sys:String> 
     <sys:String>Button 2</sys:String> 
     <sys:String>Button 3</sys:String> 
     <sys:String>Button 4</sys:String> 
     <sys:String>Button 5</sys:String> 
     <sys:String>Button 6</sys:String> 
    </x:Array> 
    <DataTemplate x:Key="buttonTemplate"> 
     <ribbon:RibbonButton Label="{Binding}" 
          Style="{StaticResource ResourceKey=RibbonButtonStyle}" /> 
    </DataTemplate> 


</ribbon:RibbonWindow.Resources> 
관련 문제