2015-10-26 2 views
0

У меня есть DataGrid со структурой, как это:Databinding - Повторное использование списка, но разные SelectedItems

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

Выпадающее выпадающие списки все имеют одинаковые параметры: Да, Нет, Может быть. Прямо сейчас, я помещал опции в наблюдаемый коллекцию.

Мой вопрос: Как связать свойство выбранного элемента в выпадающем списке так, чтобы оно тянулось от другого объекта, чем исходный наблюдаемый коллектив?

Вот код, который мог бы сделать его более четким, что я пытаюсь сделать

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

    public class question 
    { 
     public string selectedOption; 
    } 

ответ

0

Если я правильно понял ваш вопрос правильно, я думаю, короткий ответ «вы не можете». WPF проверяет, является ли выбранный элемент частью источника items и не отображает выбранный элемент, если это не так. Какое поведение вы пытаетесь создать для своего пользователя? Возможно, есть еще один способ добиться того, чего вы хотите.

Редактировать Возможно, этот похожий/дублированный вопрос + ответ поможет вам? How to set SelectedItem of a ComboBox when item is not part of the ItemsSource collection?

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> 

Codebehind

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"; 

Тогда первое поле со списком даст «Да» уже выбранное, потому что «Да» существует в коллекции, используемой как ItemSource, но вторая будет пустой , потому что нет соответствующего значения. Он все еще отображается внизу, так как я не проверял наличие там проверки.