2014-11-19 3 views
0

WPF의 DataGrid를 사용하기 시작하면서 문제가 발생했습니다. 그래서 WPF DataGrid 바인딩 목록

public class ChainCode 
{ 
    private uint _number; 
    private byte _code; 

    public uint Number { get { return _number; } set { _number = value; } } 
    public byte Code { get { return _code; } set { _number = value; } } 
} 

, 나는 그런 데이터 그리드에 ID를 바인딩 할 : 나는 ChainCode가

private List<ChainCode> _chainCode = new List<ChainCode>(); 

는 목록을 가지고

<DataGrid x:Name="dataGridChainCode" ItemsSource="{Binding _chainCode}" CanUserAddRows="True" IsEnabled="False" AutoGenerateColumns="False" Margin="10,35,18,0" VerticalAlignment="Top"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Number}" IsReadOnly="True" Header="#" Width="60"/> 
     <DataGridTextColumn Binding="{Binding Code}" Header="code" Width="60"/> 
    </DataGrid.Columns> 
</DataGrid> 

을하지만 난 내 프로그램을 시작할 때 , 나는 어떤 행을 DataGrid에 추가 할 수 없다. 단지 헤더 만 존재한다. 그리고 나는 그것을 고치는 방법을 모른다.


업데이트 : XAML에서

private ObservableCollection<ChainCode> _chainCode = new ObservableCollection<ChainCode>(); 
public ObservableCollection<ChainCode> OCChainCode { get { return _chainCode; } set { _chainCode = value; } } 

및 다음 :

ItemsSource="{Binding OCChainCode}" 

하지만 응답이 없을 나는 이러한 변경을했다. 내가 뭘 잘못 했니?


내가 이해할 수있는 한 가지는 WPF를 사용하기에는 너무 이른 것입니다. 따라서 나중에 고치겠습니다.

답변

1

비공개 회원은 바인딩 할 수 없습니다. 속성 만들기

public List<ChainCode> ChainCodeList 
{ 
    get { return _chainCode;} 
    set { _chainCode = value;} 
} 

그리고 그것에 바인딩하십시오.

목록이 앱 기간 동안 변경되는 경우 ObservableCollection<T>을 대신 사용할 수 있습니다.

+0

그러나 _chainCode는 .xaml.cs 파일에 있습니다. 즉, 컨트롤 클래스 –

+0

안에 선언되어 있습니다. 질문에 대한 답변을 얻으려면 장면 뒤에있는 바인딩 메커니즘을 이해해야합니다. –

1

숫자 또는 코드 값을 변경할 때 목록을 업데이트하려면 목록 대신 ObservableCollection을 사용하고 INotifyPropertyChanged을 구현하십시오.

목록 속성을 public 또는 protected로 설정하십시오.

+0

예/아니요. 당신은 관측 가능한 수집과 INPC에 대해 옳았습니다. 그러나 그는 여전히 개인 var를 속성으로 변경해야합니다. – Noctis

+0

그냥 수정했습니다. :-)이 경우 – bigtlb

+0

, 바로 지금 :) – Noctis

0

데이터 바인딩을 사용하려면 바인딩을 사용하려는 파트의 DataContext를 설정해야합니다. DataContext를 설정하는 여러 가지 방법이 있으며,이를 수행하는 간단한 방법은 UserControl 클래스의 생성자에 있습니다. 일반적으로 DataContext는 ViewModel (Model-View-ViewModel 패턴 사용)으로 설정되지만 모든 클래스가 될 수 있습니다.

public class ViewModel { 
    private ObservableCollection<ChainCode> _chainCode = new ObservableCollection<ChainCode>(); 

    public ObservableCollection<ChainCode> OCChainCode 
    { 
     // No need for a public setter 
     get { return _chainCode; }   
    } 
} 

의 UserControl 클래스 ([이름] .xaml.cs 파일의 클래스) :

public class MyUserControl : UserControl 
{ 
    public MyUserControl() 
    { 
     DataContext = new ViewModel(); 
    } 
} 

이제 귀하의 질문에 XAML을 사용할 수 있습니다.

<DataGrid x:Name="dataGridChainCode" ItemsSource="{Binding _chainCode}" CanUserAddRows="True" IsEnabled="False" AutoGenerateColumns="False" Margin="10,35,18,0" VerticalAlignment="Top"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Number}" IsReadOnly="True" Header="#" Width="60"/> 
       <DataGridTextColumn Binding="{Binding Code}" Header="code" Width="60"/> 
      </DataGrid.Columns> 
     </DataGrid> 

주의해야 할 일

는, 데이터 그리드에 새 행을 추가하는 자동 기능이없는,이 코드를 직접 작성해야합니다. 새로운 ChainCode 객체를 만들고 Observable 컬렉션에 추가하는 버튼을 제안하면 UI에 표시됩니다.