数据绑定 - 重用列表,但不同的选择项

时间:2015-10-26 18:46:13

标签: c# wpf data-binding

我有一个数据网格,其结构如下:

Question 1  text question 1    <pull down>
Question 2  text question 2    <pull down>
Question 3  text question 3    <pull down>

下拉组合框都有相同的选项:是,否,可能。 现在,我把选项放在一个可观察的集合中。

我的问题是:如何绑定组合框的选定项属性,使其从源observablecollection的其他对象中拉出来?

这里有一些代码可能会让我更清楚我正在尝试做什么

   public class ViewModel
   {
       ObservableCollection<string> options;
       ObservableCollection<question> questions;
   }

   public class question
   {
       public string selectedOption;
   }

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我认为简短的答案是&#34;你不能&#34;。 WPF检查选择项是否是itemssource的一部分,如果不是,则不会显示selecteditem。您尝试为用户创建什么样的行为?也许还有另一种方法可以达到你想要的效果。

编辑也许这个类似/重复的问题+答案对你有帮助吗? How to set SelectedItem of a ComboBox when item is not part of the ItemsSource collection?

答案 1 :(得分:0)

如果我正确地解释了您的问题,您希望对问题的答案选项使用相同的源列表,但是要确保选择保持彼此独立。 这是你想要的东西吗?

XAML

<StackPanel>
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="Question 1"/>
            <ComboBox x:Name="cbxOne" ItemsSource="{Binding Options}"
                        SelectedItem="{Binding Questions[0].selectedOption}"></ComboBox>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="Question 2"/>
            <ComboBox ItemsSource="{Binding Options}"
                      SelectedItem="{Binding Questions[1].selectedOption}"></ComboBox>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="Question 2"/>
            <ComboBox ItemsSource="{Binding Options}"
                      SelectedItem="{Binding Questions[2].selectedOption}"></ComboBox>
        </StackPanel>
    </StackPanel>
    <ListBox ItemsSource="{Binding Questions}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content ="{Binding selectedOption}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>
</StackPanel>

代码隐藏

public partial class MainWindow : Window
{

    ViewModel vm;
    public MainWindow()
    {
        InitializeComponent();
        vm = new ViewModel();
        this.DataContext = vm;
    }


}
public class ViewModel
{
    public ObservableCollection<string> Options { get; set; }
    public ObservableCollection<question> Questions { get; set; }
    public ViewModel()
    {
        Options = new ObservableCollection<string> { "Yes", "No", "Maybe" };
        Questions = new ObservableCollection<question>();
        Questions.Add(new question());
        Questions.Add(new question());
        Questions.Add(new question());
    }

}

public class question
{
    public string selectedOption { get; set; }
}

Capture demonstrating binding works

如果在测试构造函数中,我为集合中的问题分配了一个值,如

Questions[0].selectedOption = "Yes";
Questions[1].selectedOption = "bogus";

然后第一个组合框将选择“是”,因为“Yes”存在于用作ItemSource的集合中,但第二个组合将为空白 因为没有匹配的价值。它仍然显示在底部,因为我没有在那里进行任何检查验证。