繁体   English   中英

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

[英]WPF MVVM - repeated combobox, pass selectedItem as parameter

从Web / MVC的背景仍然可以掌握WPF。 我实现了一些在UI场景中很常见的东西,一个重复的项目列表以及一些控件,使用户可以对这些项目执行操作(我省略了一些绑定,因为它们是long 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中选择的内容。

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

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

这是您可以传递来自任意来源的多个值的方法-您可以采用与用于弥补Silverlight缺少的MultiBinding方法相同的方法-中继。 这个想法非常简单-创建一个合成的FrameworkElement (在此为FE ),它将用作绑定外观,我将使用一个简单的实例-例如TextBlock

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

最终使用ElementName作为源和Tag作为路径绑定到外观FE

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM