2013-08-28 4 views
2

ObservableCollection이 있고 Textbox를 해당 컬렉션의 특정 요소에 바인딩하려고합니다. ObservableCollection의 Item은 INotifyPropertyChanged를 구현하는 Type입니다.ObservableCollection의 한 요소에 바인딩하는 방법

ObservableCollection에서 올바른 요소를 선택하는 속성을 만드는 방법에 대해 생각해 봤지만 컬렉션의 해당 요소가 변경되면이 속성을 인식해야합니다. 이것이 올바른 방법인지 확실하지 않습니다. 이 작업을 수행.

+0

인덱스 또는 속성 값별로 지정 하시겠습니까? –

+0

은 인덱스가 아닌 해당 요소의 속성 값으로 지정됩니다. – FlyingFoX

답변

1

를 사용하여 내 문제를 해결하기 위해 내가 ObservableCollection에에서 올바른 요소를 선택하는 속성을 생성하고 ObservableCollection에의 CollectionChanged 이벤트에 추가 내 SelectionProperty의하여 PropertyChanged 이벤트를 발생하는 이벤트 핸들러를 만들었습니다.

void myObservableCollection_CollectionChanged(
     Object sender, NotifyCollectionChangedEventArgs e){ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs("SelectionProperty")); 
    } 
} 

내 selectionProperty : 다른 곳에서 수업 시간에

myObservableColleciton.CollectionChanged += 
     new NotifyCollectionChangedEventHandler(
     myObservableCollection_CollectionChanged); 

이 이벤트 핸들러를 정의하십시오 ObservableCollection에와 SelectionProperty를 포함하는 클래스의 생성자에서 다음과 같이 보입니다 코드에서

다음과 같이 보입니다.

public User SelectionProperty 
{ 
    get { return myObservableCollection.First(user => user.id == 0); } 
} 

SelectionProperty가 ObservableCollection 이상에 의존하는 경우 (어쩌면 우리는 특정 연령에 가장 가까운 사용자를 다른 곳에서 찾으려고합니다), SelectionProperty에 대한 PropertyChanged 이벤트가 발생해야합니다. 속성이 변경됩니다.

3

일반적으로 MVVM을 사용하는 경우 ObservableCollection 및 데이터 바인딩으로 업데이트하는 SelectedItem의 속성을 사용하여 viewModel을 갖게됩니다.

예를 들어, 뷰 모델은 다음과 같이 수 :

class ProductsViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<Product> Products { get; set; } 
    private Product _selectedProduct; 

    public Product SelectedProduct 
    { 
     get { return _selectedProduct; } 
     set 
     { 
      _selectedProduct = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("SelectedProduct")); 
     } 
    } 



    public ProductsViewModel() 
    { 
     Products = new ObservableCollection<Product>(); 
     Products.Add(new Product() { Name = "ProductA" }); 
     Products.Add(new Product() { Name = "ProductB" }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

귀하의 윈도우 객체의 XAML :

<Window x:Class="ProductsExample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListBox HorizontalAlignment="Left" Height="171" Margin="32,29,0,0" VerticalAlignment="Top" Width="176" 
       ItemsSource="{Binding Products}" 
       SelectedItem="{Binding SelectedProduct, Mode=TwoWay}" 
       DisplayMemberPath="Name" 
       /> 
     <TextBox HorizontalAlignment="Left" Height="33" Margin="36,226,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="172" 
       Text="{Binding SelectedProduct.Name, Mode=TwoWay}"/> 

    </Grid> 
</Window> 

당신은 단지 데이터 컨텍스트 설정 숨김 코드 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new ProductsViewModel(); 
    } 
} 

목록 상자에서 제품을 선택할 때마다 텍스트 상자가 선택한 제품으로 업데이트되고 텍스트 상자에서 제품을 변경하면 (제품이 INotifyPropertyChanged를 올바르게 구현 한 경우) 목록 상자의 항목도 업데이트됩니다. 분명히

이는 숨김 코드를 사용하여 모든 달성하지만, 여러 가지 이유로 수는 여기에 설명 : http://msdn.microsoft.com/en-us/magazine/dd419663.aspx, 당신이 필요로하는 항목에 액세스 할 수있는 인덱스로 특정 경우 뷰 모델

2

을하는 것이 좋습니다 인덱스

<TextBlock Text="{Binding MyItemsSource[2]}" /> 
관련 문제