我只是没有得到它:我有一个功能区菜单,其中一些选项卡/组/按钮在xaml中定义,一些选项卡/组/按钮在运行时定义(用户加载某个“命令集”) 。为了实现这一点,我将在xaml中定义的ribbonTab和一个集合容器放在compositeCollection中。
MainWindow.xaml
<RibbonWindow x:Class="test_ribbonButtonBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility /2006"
xmlns:local="clr-namespace:test_ribbonButtonBinding"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" DataContext=" {StaticResource svm}">
<RibbonWindow.Resources>
<CollectionViewSource x:Key="tabs" Source="{Binding ribbon}"/>
</RibbonWindow.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Ribbon x:Name="RibbonMenu" Grid.Column="0" Grid.Row="0">
<Ribbon.ItemsSource>
<CompositeCollection>
<RibbonTab Header="Testtab" >
<RibbonGroup x:Name="Testgroup" Header="Testgroup">
<RibbonButton LargeImageSource="Icons/question.png" Label="TestAddCommand" Command="{Binding cmdTestAddCommand}" />
<RibbonButton LargeImageSource="Icons/question.png" Label="TestReadCommand" Command="{Binding cmdTestReadCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstSequence}"/>
</RibbonGroup>
</RibbonTab>
<CollectionContainer Collection="{Binding Source={StaticResource tabs}}"/>
</CompositeCollection>
</Ribbon.ItemsSource>
</Ribbon>
<ListView x:Name="lstSequence" ItemsSource="{Binding sequence}" Grid.Row="1" Grid.Column="0" SelectionMode="Extended"/>
</Grid>
</RibbonWindow>
现在出现了已定义按钮的CommandParameter问题:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=lstSequence'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'RibbonButton' (Name=''); target property is 'CommandParameter' (type 'Object')
这可能很简单,但我无法绕过它:如何将命令参数绑定到ListView中的selectedItems。这显然是错误的dataContext。
让我感到困惑的是:如果我遗漏复合集合(因此所有选项卡都只是在xaml中定义),命令会正确绑定到viewmodel中的元素,而commandparameter会正确绑定到窗口中的元素(如何无论如何,这项工作应该BOTH绑定到窗口的DataContext中指定的viewmodel ???)
任何帮助表示感谢。
RESU
编辑:
最后在listview中设置setter属性解决了问题
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
但是我仍然想知道为什么我的方法不适用于任何其他方式的解释?
答案 0 :(得分:1)
两个选项(未经测试):
1)使用父元素通过RelativeSource
传递值:
<Grid Tag={Binding SelectedItem, ElementName=lstSequence}>
...
<!-- hopefully there are no other grids on the way -->
<RibbonButton CommandParameter="{Binding Tag, RelativeSource={RelativewSource FindAncestor, AncestorType=Grid}}"
Command="{Binding cmdTestReadCommand}" .../>
...
<ListView x:Name="lstSequence" ... />
</Grid>
2)根本不使用参数
<ListView SelectedItem={Binding SelectedItem, Mode=OneWayToSource} ... />
查看模型:
public whatevertype SelectedItem { get; set; }
内部命令执行委托
var parameter = SelectedItem;