WPF MVVM - 重复组合框,传递selectedItem作为参数

时间:2014-04-11 10:49:22

标签: c# wpf xaml mvvm combobox

仍然可以从web / MVC的背景中掌握WPF。我已经实现了一些在UI场景中非常常见的东西,一个重复的项目列表以及一些控件允许用户对这些项目执行操作(我省略了一些绑定,因为它们是长的relativeSource指令,它们是与问题无关):

<ItemsControl ItemsSource="{Binding Counts}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ComboBox ItemsSource="{}" DisplayMemberPath="Description"></ComboBox>
                <Button Command="{}" Content="Add></Button>
                <TextBlock VerticalAlignment="Center">
                    <Run Text="{Binding Path=Date, StringFormat=dd/MM/yyyy}"></Run>
                    <Run Text=" - "></Run>
                    <Run Text="{Binding Name}"></Run>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

正如您所看到的,ComboBox没有实现SelectedValue或SelectedValuePath - 它无法真正绑定到ViewModel属性,因为它对Counts中的每个项重复。所以目前它只是列出了可能的值。

Button命令绑定到ViewModel上的命令。但是,为了在按钮上执行任何操作,我需要将参数传递给命令 - 即,按钮绑定到的项目的ID以及用户在与此按钮配对的特定ComboBox中选择的任何内容。 / p>

ID很简单 - 我可以绑定一个CommandParameter。但是如何将选定的ComboBox ID传递给函数,如何确保它是配对的ComboBox中的ID?

编辑:进一步的研究表明,虽然传递一个CommandParameter很简单,但传递两个却不是。我看到涉及转换器的答案,但在这种情况下,我的两个参数来自不同的来源,所以我不能真的这样做。关于如何通过两者的帮助也将不胜感激。

2 个答案:

答案 0 :(得分:1)

以下是您可以传递来自任意来源的多个值的方法 - 您可以使用与用于补偿MultiBinding - 中继中丢失的Silverlight的方法相同的方法。这个想法非常简单 - 创建一个合成的FrameworkElement(此处为 FE ),它将充当绑定外观,我会选择一个轻量级 - 例如TextBlock。< / p>

使用TagMultiBinding将其Converter属性绑定到多个位置,各个分支将绑定到各个ElementNames。转换器将简单地打包来自多个源的值并返回它 - 它可以是逗号分隔的字符串,它可以是由您决定的对象。转换器的返回显然会保留在外观的Tag属性 FE

最终使用ElementName作为源并以Tag作为路径绑定到立面 FE

答案 1 :(得分:0)

一种方法是将组合框双向绑定到counts集合中对象类的属性。然后,您在组合中所做的选择将直接改变相应的对象,然后您不需要在单击按钮时手动检测/进行这些更改。

目前,counts集合的类型可能不支持,因此您可以创建一个添加了这些额外属性的类,并使用集合中的那些属性。然后,您的按钮将在counts集合上运行,以根据需要创建/更改数据。