仍然可以从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很简单,但传递两个却不是。我看到涉及转换器的答案,但在这种情况下,我的两个参数来自不同的来源,所以我不能真的这样做。关于如何通过两者的帮助也将不胜感激。
答案 0 :(得分:1)
以下是您可以传递来自任意来源的多个值的方法 - 您可以使用与用于补偿MultiBinding
- 中继中丢失的Silverlight
的方法相同的方法。这个想法非常简单 - 创建一个合成的FrameworkElement
(此处为 FE ),它将充当绑定外观,我会选择一个轻量级 - 例如TextBlock
。< / p>
使用Tag
和MultiBinding
将其Converter
属性绑定到多个位置,各个分支将绑定到各个ElementNames。转换器将简单地打包来自多个源的值并返回它 - 它可以是逗号分隔的字符串,它可以是由您决定的对象。转换器的返回显然会保留在外观的Tag
属性 FE 。
最终使用ElementName
作为源并以Tag
作为路径绑定到立面 FE 。
答案 1 :(得分:0)
一种方法是将组合框双向绑定到counts
集合中对象类的属性。然后,您在组合中所做的选择将直接改变相应的对象,然后您不需要在单击按钮时手动检测/进行这些更改。
目前,counts
集合的类型可能不支持,因此您可以创建一个添加了这些额外属性的类,并使用集合中的那些属性。然后,您的按钮将在counts
集合上运行,以根据需要创建/更改数据。