2013-10-31 2 views
0

wrt 데이터 바인딩 아래의 mvvm 패턴에서 무엇이 잘못 되었습니까?viewmodel에 DataGrid 바인딩

내가 보는 것은 DataGrid이 여분의 열과 여분의 행 (둘 다 비어 있음)을 보여주는 이유는 무엇입니까?

그리고 내보기에서 기본적으로 첫 번째 항목을 선택하려면 어떻게해야합니까?

뷰 - 모델 :

public class Instance { public string Name { get; set; } } 

public class BaseData 
{ 
    public ObservableCollection<Instance> Instances { get { return instances; } } 
    public BaseData() 
     { 
      var bw = new BackgroundWorker(); 
      bw.DoWork += new DoWorkEventHandler(fetch); 
      bw.RunWorkerAsync(); 
      bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(fetched); 
     } 
    void fetch(){...} 
    void fetched(..){... // raise event 'Fetched' to the view } 
} 

보기 (XAML) : (코드 숨김)

<DataGrid AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Instance" Binding="{Binding Path=Name, Mode=OneWay}" /> 
    </DataGrid.Columns> 
</DataGrid> 

보기 :

BaseData BaseData; 

public MainWindow() 
{ 
    InitializeComponent(); 

    Loaded += delegate 
    { 
     BaseData = new BaseData(); 
     BaseData.Fetched += basedata_fetched; 
    }; 
} 

void basedata_fetched(...) 
{ 
    DataContext = BaseData; 
} 

답변

1

1) CanUserAddRows은 = "거짓"이 제거됩니다 여분의 행.

2) 열의 너비 = "*"는 표의 너비까지 늘어나고 다른 열처럼 보이는 것을 숨 깁니다.

<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Instance" Binding="{Binding Path=Name, Mode=OneWay}" Width="*" /> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

수정. 그런 디자인이 얼마나 이상합니다. – Gerard

+0

:) 그래, 그들은 당신이 무엇이 아닌지 구성 할 것을 기대합니다. –

1

은 데이터 그리드의 당신의 정의가 있어야 데이터 그리드의 첫 번째 항목을 선택합니다

<DataGrid AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}" SelectedIndex="0"> 
0

당신은 당신의 데이터 그리드에 AutoGenerateColumns를 끄고 당신이 원하는대로 표시하기 위해 자신의 열을 선언해야합니다 .

항목을 선택하는 것과 마찬가지로 DataGrid의 SelectedItem을 ViewModel 속성에 바인딩 할 수 있습니다. 그러면 SelectedItem을 첫 번째 인스턴스로 설정할 수 있습니다.

<DataGrid AutoGenerateColumns="False" 
      ItemsSource="{Binding Instances}" 
      SelectedItem="{Binding SelectedInstance, Mode=TwoWay}"> 
       <DataGrid.Columns> 
        ... 
       </DataGrid.Columns> 
</DataGrid> 
+0

이미 AutoGenerateColumns = "False"는 여분의 열에 영향을 미치지 않습니다. 아마도 열이 아니라 "나머지 공간"일종의 것입니다. – Gerard

+0

SelectedItem = "{Binding SelectedInstance}"는 아마도 정확합니다. 처음에는 작동하지 않으므로 SelectedIndex = "0"이 필요합니다. – Gerard

+1

기본적으로 그리드의 너비가 열이 필요하면 추가 공간이 생깁니다. 열 중 하나를 Width = "*"로 설정하면 남은 공간을 차지합니다. SelectedInstance가 작동하지 않는 경우 OnPropertyChanged가 발생했는지 확인해야하므로 속성이 변경되면보기에 알림이 전달됩니다. – DamenEU