2017-02-03 11 views
0

Итак, я пытаюсь связать текущий элемент с ItemsSource с SelectedItem в Comobox. Надеюсь, следующий код (упрощенный пример) продемонстрирует то, что я хочу.Связывание SelectedItem в comobox с текущим ItemSource?

public class book : INotifyPropertyChanged{ 
private string _title; 
private string _author; 

public book(){ 
    this.Title = ""; 
    this. 
} 
public string Title{ 
    get{return _title;} 
    set{ 
     _title = value; 
       NotifyPropertyChanged("Title"); 

    } 
} 
public string Author{ 
    get{return _author;} 
    set{ 
     _author = value; 
     NotifyPropertyChanged("Author"); 
    } 
} 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

ThisViewModel.cs Код:

public class ThisViewModel{ 
    private ObservableCollection<Book> _book; 
    private List<Book> _existedBooks; 
    public ObservableCollection<Book> Book{ 
     get{return _book;} 
     set{_book = value;} 
    } 

    public ThisViewModel(){ 
     Books = new ObservableCollection<Book>(); 
     Books.Add(new Book()) 
    } 
    public List<Book> ExistedBooks{ 
     get{return _existedBooks;} 
     set{_existedBooks = value;} 
    } 
} 

Код фоновым из ThisView.xaml.cs:

public partial class ThisView{ 
    public ThisView(){ 
     InitializeComponent(); 
     this.DataContext = new ThisViewModel(); 

    } 
} 

Часть XAML код ThisView.xaml:

<ItemsControl ItemsSource="{Binding Path=Book}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Path=ExistedBooks}" 
      DisplayMemberPath="Title" 
      SelectedItem="{Binding <HERE IS MY PROBLEM>}" 
      ></ComboBox> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Как я могу связать sel ectedItem (один из существующих) для элемента ItemControl (книга).

Надеюсь, я четко сформулировал свою точку зрения. Спасибо за ваше время.

+1

Возможный дубликат [Как связать с родительским DataTemplate из элемента ItemsControl.ItemTemplate] (http://stackoverflow.com/questions/8184972/how-to-bind-to-parent-datatemplate-from-within-an- itemscontrol-itemtemplate) –

+0

В чем проблема? – ColinM

ответ

0

Вы должны добавить тот же Book объект для обеих коллекций для этой работы:

public ThisViewModel() 
{ 
    Book = new ObservableCollection<Book>(); 
    ExistedBooks = new List<Book>(); 

    Book bookA = new Book() { Title = "Title A" }; 
    Book.Add(bookA); 
    ExistedBooks.Add(bookA); 
} 

Затем вы можете связать SelectedItem свойство ComboBox для текущего пункта в ItemsControl, как это:

<ItemsControl ItemsSource="{Binding Path=Book}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding DataContext.ExistedBooks, RelativeSource={RelativeSource AncestorType=ItemsControl}}" 
           SelectedItem="{Binding Path=., Mode=OneWay}" 
           DisplayMemberPath="Title" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Но что мне действительно нужно связать (заполнить) объект 'Book' из коллекции' Books' в объект 'Book' из коллекции' ExistedBooks'. – Symmetric

+1

Вы не можете добавлять объекты в коллекции в XAML. Вы должны сделать это в модели представления. XAML - это язык * разметки *. Кроме того, логика приложения должна быть реализована в модели представления. Это один из краеугольных камней шаблона MVVM. – mm8

+0

Вы отвечаете, если у меня есть книга в «ExistedBooks» с названием _Title A_, и я выбрал ее, в то время как текущий элемент в списке «Книга» имеет заголовок _Title B_, если я сломаюсь в этот момент, то I_Itle B_ станет _Title A_, или это невозможно? – Symmetric