2011-03-28 2 views
5

WPF 응용 프로그램에 Datagrid 컨트롤이 있고이 컨트롤을 주 윈도우 클래스의 ObservableCollection 속성에 바인딩하려고합니다. 내가 바인딩하기 위해 노력하고있어 속성은 다음과 같이 정의된다WPF ItemsSource Binding

private ObservableCollection<RequestResult> m_SentRequests = new ObservableCollection<RequestResult>(); 
public ObservableCollection<RequestResult> SentRequests { get { return m_SentRequests; } } 

내 데이터 그리드는 그룹에있는하여 MainWindow를로 설정 데이터 컨텍스트가 있습니다

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" Margin="0,305,0,0" Name="grpResults" VerticalAlignment="Top" Width="712" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}}"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Margin="6,6,6,0" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" DataContext="{Binding}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 

문제 나 데 속성 창에서 SentRequests를 ItemsSource로 선택한 후에도 "Edit Property-Bound Columns"옵션을 선택할 수 없습니다. 이 작업을 수행하려면 먼저 ItemsSource를 설정해야합니다. "대화 상자가 나타납니다. "열 생성"및 "열 제거"를 선택하면 같은 오류가 발생합니다. 마치 대화 상자의 ItemsSource 속성에서 아무 것도 설정하지 않은 것입니다.

AutoGenerateColumns를 true로 설정할 수 있으며 표시하려는 열이 아니라 내 데이터가 바인딩되는 것을 볼 수 있습니다.

저는 WPF를 처음 접했고 Windows 서비스 테스트를위한 빠른 테스트 응용 프로그램으로 작성했습니다.

내가 뭘 잘못하고 있는지 알아?

+0

'DataContext = "{Binding}"'DataGrid에서 중복되는 것은 생각합니다. 왜냐하면 일반적으로 DataContext가 상속되기 때문입니다. –

+0

@ H.B. 고마워, 나는 그걸 정리했다. 그것은 차이를 만들지 않았습니다 (당신이 기대하지는 않았습니다). 아마 여러 물건을 시험해 보는 나 같은 인공물. – Redbaran

답변

1

DataContext 태그없이 시도 했습니까? GroupBox와 DataGrid 모두. 이 같은

편집

뭔가 :

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" > 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 
+0

내가 무슨 뜻인지 잘 모르겠다면 구체적으로 할 수 있을까요? 지금 XAML 마크 업은 Visual Studio에서 생성 한 것입니다. – Redbaran

+0

다니엘, 그건 작동하지 않습니다. datacontext를 전혀 설정하지 않으면 내 속성에 대한 get이 더 이상 호출되지 않으며 속성 창을 사용하여 열을 편집 할 수도 없습니다. – Redbaran

2

이것은 아마도 디자이너가 지속적으로 (코드 숨김 생성자를 건너 뛰는 등) 컴파일하지 않고 렌더링을 수행하는 속임수의 일부의 결과이다. 컬렉션을 별도의 클래스로 옮기고 그 인스턴스를 MVVM ViewModel과 같은 DataContext로 사용하십시오. 다른 클래스는 정상적으로 초기화하고 디자이너에게 바인딩 된 속성을 제공 할 수 있어야합니다.

3

itemSource 내에 Path 매개 변수가 필요하다고 생각하지 않습니다. 당신은 방금 ItemsSource = {바인딩 SentRequests}로 바인딩을 설정 할 수 있어야한다

내가 더미 컬렉션을 만들 경우 당신은 또한 예를 들어 코드에 그리드 항목 소스에 바인딩 할 수 있습니다 : 다음

public class People 
{ 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 
    public string address { get; set; } 
    public string zip { get; set; } 
} 

및 채우기를 그것은

this.AllPeople = new ObservableCollection<People>(); 


     private void FillData() 
    { 
     People p1 = new People(); 
     p1.FirstName = "John"; 
     p1.LastName = "Doe"; 
     p1.Age = "24"; 
     p1.address = "123 Main Street"; 
     p1.zip = "11111"; 

     People p2 = new People(); 
     p2.FirstName = "Jane"; 
     p2.LastName = "Smith"; 
     p2.Age = "36"; 
     p2.address = "456 Water Street"; 
     p2.zip = "22222"; 

     People p3 = new People(); 
     p3.FirstName = "Larry"; 
     p3.LastName = "Williams"; 
     p3.Age = "24"; 
     p3.address = "785 Water Street"; 
     p3.zip = "33333"; 

     this.AllPeople.Add(p1); 
     this.AllPeople.Add(p2); 
     this.AllPeople.Add(p3); 
    } 

I는 다음과 같은 mainpage의 contsructor 또는 방법의 항목 소스 설정할 수 :

this.gridviewname.ItemsSource = "AllPeople을";

+0

디자이너에서도 작동합니까? –

+0

디자이너가 무슨 뜻인지 설명 할 수 있습니까?바인딩을 말하는 겁니까? 그렇다면 그렇습니다. 아이템 소스를 콜렉션에 설정하면 좋은 것이 좋습니다. – rlcrews