c#mvvm绑定按钮commandparameter来控制compositeCollection外部

时间:2015-09-17 10:29:01

标签: c# wpf xaml mvvm

我只是没有得到它:我有一个功能区菜单,其中一些选项卡/组/按钮在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>

但是我仍然想知道为什么我的方法不适用于任何其他方式的解释?

1 个答案:

答案 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;