2010-08-02 5 views
0

이 문제로 많은 어려움을 겪어 왔지만 많은 것을 읽었지만 대부분의 예제는 너무 간단합니다. 아주 간단한 ObservableCollection을 DataGrid에 바인딩하려고합니다.WPF 개체 소스를 사용한 데이터 바인딩이 업데이트되지 않습니다.

public class SingleItem { 
private String _name=null; 

public String Name { 
    get { return _name; } 
    set { _name=value; } 
} 

public SingleItem(String name) { 
    Name=name; 
} 

클래스 ManyItems이 컬렉션 호스팅하고 다음과 같이 정의된다 : 컬렉션 내에서 슈퍼 간단한 개체는 다음과 같이 정의된다 "SingleItems"입니다 내 기본 창에서

public class ManyItems{ 
private ObservableCollection<SingleItem> allItems=new ObservableCollection<SingleItem>(); 


public ManyItems() { 
    AllItems.Add(new SingleItem("inside"));//debug code 
} 


public ObservableCollection<SingleItem> AllItems { 
    get { return allItems; } 
    set { allItems=value; } 
} 

public void AddItem(SingleItem item) { 
    AllItems.Add(item); 
} 
} 

을 나는 단지

public partial class MainWindow : Window{ 
int count=0; 
ManyItems _items=new ManyItems(); 

public ManyItems Items { 
    get { return _items; } 
    set { _items=value; } 
} 

public MainWindow(){ 
this.InitializeComponent(); 
} 

private void Button_Click(object sender, System.Windows.RoutedEventArgs e){ 
Items.AddItem(new SingleItem("name_"+count)); 
count++; 
} 

}

: 사용자가 버튼을 누를 때 ManyItems를 업데이트 할

마지막으로 내 XAML은 (단축 여기서 "...")과 같습니다

<Window 
... 
xmlns:local="clr-namespace:DataGridTEst" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:XamlGeneratedNamespace="clr-namespace:XamlGeneratedNamespace" mc:Ignorable="d" 
x:Class="DataGridTEst.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="640" Height="480"> 

<Window.Resources> 
    <local:ManyItems x:Key="ManyItemsDataSource" d:IsDataSource="True"/> 
</Window.Resources> 

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ManyItemsDataSource}}"> 
    <Button Content="Button" .... Click="Button_Click"/> 
    <DataGrid ... ItemsSource="{Binding AllItems}"/> 
</Grid> 

나는이 응용 프로그램을 실행하면, 그리드 내가 생성자에서 만든 "내부"를 SingleItem을 보여줍니다

. 그러나 기본 컬렉션에 대한 변경 사항은 DataGrid에 반영되지 않습니다. INotifyPropertyChanged를 사용하려고했지만 성공하지는 못했습니다. 나는 내 이해에 심각한 오류가 있다고 생각한다. 아무도 내가 잘못하고있는 것을 설명 할 수 있습니까? 또한 온라인 예제 (모든 것이 생성자 내부에서 수행되는 것은 아닙니다)가 크게 감사하겠습니다. 당신의 도움에 대한

감사합니다, 세바스찬

답변

3

당신은 뒤에 코드를 수정하고 ManyItems의 인스턴스가 귀하의 XAML이 바인딩되는 동일한 인스턴스가 아닙니다. WindowResources에있는 <local:ManyItems/>은 별도의 별개의 ManyItems 인스턴스를 생성하려고합니다.

같은 인스턴스를 사용하고 그것을 잘 작동합니다

public MainWindow(){ 
    this.InitializeComponent(); 
    this.DataContext = _items; 
} 

을 그리고 XAML에 Resources 부분을 제거하고 Grid 단순히로 변경 :

<Grid x:Name="LayoutRoot"> 
+0

켄트 :-) 다시 궤도에 저를 얻을 완벽했다 :이 슈퍼 빠른 답변을 주셔서 대단히 감사합니다. 나는 나의 책상에서 1 ~ 2 일간 떨어져있을 것이다. 그러나 나의 복귀 후 그것을 시도 할 것이다. – bash74

+0

켄트 : 나는 당신의 해결책을 시도 할 기회를 가졌습니다. 그것은 완벽하게 작동합니다. 고맙습니다. 이제 Blend (xaml을 만든)에서 이러한 것들을 정의하는 방법을 알아 내면됩니다. – bash74

0

내가 다른 해결책을 발견 어디 혼합에 의해 생성 된 코드를 사용할 수 있습니다. 모든게은 동일하게 유지하지만, MainWindow를이 같이 작동합니다 :주의해야 할

public partial class MainWindow : Window{ 
int count=0; 
public MainWindow(){ 
    this.InitializeComponent(); 
} 

private void Button_Click(object sender, System.Windows.RoutedEventArgs e){ 
      ManyItems ds=(ManyItems)this.FindResource("ManyItemsDataSource"); 
      ds.AddItem(new SingleItem(count.ToString())); 
     count++; 
} 
} 

중요한 것은 더 이상 어떤 속성 항목이 없다는 것입니다. 그 대신 코드는 명명 된 리소스 "ManyItemsDataSource"를 검색하고이를 ManyItems로 캐스팅합니다. @Kent : 두 개의 서로 다른 인스턴스에 힌트가

세바스찬

관련 문제