C# WPF功能区:DataTemplate导致BindingExpression路径错误
我在使用WPF RibbonControl(2010年10月版)时遇到了一个小问题。我的想法是将RibbonGroup的ItemsSource属性绑定到我的viewmodel,并根据需要使用DataTemplate创建RibbonButtons。这是可行的,但在显示窗口时会导致绑定错误(每个按钮一个):C# WPF功能区:DataTemplate导致BindingExpression路径错误,c#,wpf,datatemplate,ribbon,C#,Wpf,Datatemplate,Ribbon,我在使用WPF RibbonControl(2010年10月版)时遇到了一个小问题。我的想法是将RibbonGroup的ItemsSource属性绑定到我的viewmodel,并根据需要使用DataTemplate创建RibbonButtons。这是可行的,但在显示窗口时会导致绑定错误(每个按钮一个): System.Windows.Data错误:40:BindingExpression路径错误:“在对象”“RibbonContentPresenter'(Name='PART\U Content
System.Windows.Data错误:40:BindingExpression路径错误:“在对象”“RibbonContentPresenter'(Name='PART\U ContentPresenter')上找不到IsDropDownOpen”属性。BindingExpression:Path=IsDropDownOpen;DataItem='RibbonContentPresenter'(Name='PART\u ContentPresenter');目标元素是“RibbonButton”(名称=“”);目标属性为“NoTarget”(类型为“Object”)
这是一个代码片段,viewmodel被字符串数组替换,但问题是相同的:
<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>
按钮1
按钮2
按钮3
按钮4
按钮5
按钮6
同样,它可以工作,但是绑定错误有点烦人。有办法摆脱它吗 绑定错误位于RibbonControlsLibrary中RibbonButton的控件模板中。该样式定义了以下MultiDataTrigger,并在RibbonButton用作另一个控件(如RibbonSplitButton)的一部分时使用
<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>
我使用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>
按钮1
按钮2
按钮3
按钮4
按钮5
按钮6
为功能区按钮创建自定义控件模板成功。启用=false时不起作用,或者当绑定到按钮的ICommand为CanExecute=false时,它应该是灰色的,但它只是保持了颜色,因此用户会感到困惑:a)悬停不起作用,b)无法单击按钮;看起来应用程序将被挂起。所以这个模板不完整。。。