2017-10-27 15 views
-2

메인 창이 - 내 DataGrid 만 표시되면 DataGrid은 0 행을 표시합니다. Source={Binding Source=RowItems} 소스에서바운드 데이터 소스에 항목이있을 때 DataGrid에 행이 표시되지 않는 이유는 무엇입니까?

<DataGrid     
     AutoGenerateColumns="True" 
     CanUserAddRows="False" 
     CanUserReorderColumns="True" 
     CanUserResizeColumns="True" 
     DataContext="ClientListViewModel" 
     ItemsSource="{Binding Source=RowItems}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

내 기본보기 모델, ClientListViewModel의 속성, RowItems입니다 :

이처럼 내 그리드 모습입니다.

viewmodel은 ClientListView의 내 머리글에서 호출되는 Read 메서드가 있습니다. 이 문제를 디버깅 할 때 RowItems 항목 원본이 올바르게 채워지는 것을 볼 수 있습니다.

주 화면의 내 초기화 문제의 DataGrid를 포함하는 UserControl은 다음과 같습니다

내가 바로 model.Read(); 후 중단 점을 넣어
public MainWindow() 
{ 
    InitializeComponent(); 
    InitializeListView(); 
} 

private void InitializeListView() 
{ 
    var model = new ClientListViewModel(); 
    model.Read(); 
    var view = new ClientListView(); 
    view.DataContext = model; 
    Content = view; 
} 

, 그 model.RowItems 속성이 12 개 항목, 아직 DataGrid 쇼를 보여줍니다 행이 없습니다.

DataGrid이 제로 행을 렌더링하는 이유는 무엇입니까?

+4

'{Binding Source = RowItems} '를 사용하면'DataContext'의'RowItems' 속성에 바인딩하지 않고 명시 적으로 설정 한 전체 바인딩 소스 객체가 아닌이 특정 경우에는 ""RowItems "'문자열로 해석됩니다 (8 자로되어 있음). 'Binding Path = RowItems '또는'{Binding RowItems}'와 같이 바인딩에'Path' 대신'Source'를 설정해야합니다. – Grx70

+0

@ Grx70 고마워,하지만 지금은 0 행이있다. 'ItemsSource = "{Binding Path = RowItems}"의'RowItems '에 마우스를 올려 놓으면 해당 목록 속성에는 12 개의 항목이 있지만 행은 없다는 것을 알 수 있습니다! – ProfK

+3

그 이유는 명시 적으로'DataGrid.DataContext = "ClientListViewModel"'을 설정했기 때문이며, 다시''ClientListViewModel ''이라는 문자열로 해석됩니다.이 문자열은'RowItems'라는 속성을 갖지 않습니다. 'DataGrid'가'ClientListView'의 일부인 경우'DataGrid.DataContext' 설정을 생략 할 수 있습니다 (기본적으로'ClientListView'에서 상속받습니다). 그렇지 않으면 아마도'ClientListViewModel' 인스턴스로 해석 될 적절한 바인딩을 사용해야합니다. 데이터 바인딩 개요 (https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/data-binding-overview) 문서를 참조하십시오. – Grx70

답변

0

모든 부품이 있지만 제대로 정렬되지 않았습니다. DataBinding을 이용하려면 특정 패턴을 따라야합니다. 이 경우 다음 단계를 따라야합니다. 만 표시

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

public ClientListViewModel Clients { get; set; } 

private ClientListViewModel InitializeListView() { 
    var model = new ClientListViewModel(); 
    model.Read();  
    return model; 
} 

그리고 MainWindowDataGridDataContext

으로 상속이 경우 MainWindow 자체 뷰의 DataContextDataGrid의 특성에 따라 그 ItemSource을 결합한다 포함
<DataGrid     
     AutoGenerateColumns="False" 
     CanUserAddRows="False" 
     CanUserReorderColumns="True" 
     CanUserResizeColumns="True" 
     ItemsSource="{Binding Clients.RowItems}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

'DataContext = this '를 설정 한 후'Clients'를 설정 중이며 해당 속성에 대한 변경 알림이 없으므로 WPF는 변경 사항을 인식하지 않으므로 데이터가 표시되지 않습니다. 표시됩니다. 이와 같은 질문에서 그러한 것들은 중요합니다. – Evk

+0

@Evk correct. 내 잘못이야. 지금 업데이트 중입니다. – Nkosi

+0

UI (이 경우 MainWindow)를 datacontext로 설정하는 것은 실제로 MVVM에 대한 것입니다. MVVM의 가장 큰 장점 중 하나 인 UI를 건드리지 않고 뷰 모델을 재사용/교환 할 수 없습니다 – Dominik

0

바인딩 소스 (클래스)의 액세스 한정자가 public으로 설정되어 있는지 확인해야합니다. DataGridItemsSource의 바인딩 DataContext에서 "ClientListViewModel"를 제거에서

0

제거 Source.

<DataGrid     
     AutoGenerateColumns="True" 
     CanUserAddRows="False" 
     CanUserReorderColumns="True" 
     CanUserResizeColumns="True" 
     ItemsSource="{Binding RowItems}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

기본적으로 바인딩은 DataContext 속성에 의해 지정된 데이터 컨텍스트 (있는 경우)를 상속합니다. 그러나 Source 속성은 명시 적으로 바인딩 원본을 설정하고 상속 된 데이터 컨텍스트를 재정의하는 방법 중 하나입니다. 당신이 다음

ItemsSource="{Binding Source=RowItems}" 

을 설정하면 RowItems이 (아이폰에 8) 문자열로 변환하기 때문에 8 개 개의 라인을 볼 수있다.

+0

@ProfK이 솔루션을 테스트 한 결과 작동 할 것입니다 – user2250152

3
{Binding Source=RowItems} 

는 속성 RowItems에 결합하지 않습니다.

당신은 또한 정상적인 List하지 않는 컬렉션에 변화가 있다는 UI를 통지로의 ViewModel에서 속성 RowItems 유형 ObservableCollection의 있는지 확인

{Binding RowItems} 

를 사용해야합니다. (바인딩 된 후 목록의 데이터를 수정하는 경우이 값이 필요합니다)

+1

이 답변에 추가하려면 (아마도 해결책이라고 생각합니다) [속성 변경 알림] (https : // docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification)도 도움이 될 수 있습니다. –

+0

예, 문제는 Binding to RowItems 속성이므로 두 가지 정답이 있습니다. – user2250152