[英]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
。
使用MultiBinding
和Converter
将其Tag
属性绑定到您的多个位置,各个分支将绑定到各个ElementNames。 转换器将简单打包来自多个来源的值并将其返回-它可以是逗号分隔的字符串,也可以是取决于您的对象。 转换器的返回值显然将保留在外观FE的Tag
属性中。
最终使用ElementName
作为源和Tag
作为路径绑定到外观FE 。
一种方法是使组合框双向绑定到counts
集合中对象类的属性。 然后,您在组合中所做的选择将直接更改适当的对象,然后您无需在单击按钮时手动检测/进行那些更改。
就目前而言, counts
集合的类型可能不支持该类型,因此您可以创建一个添加了这些额外属性的类,并在集合中使用这些属性。 然后,您的按钮将在counts
集合上进行操作,以根据需要创建/更改数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.