2013-10-31 194 views
0

我在做什麼錯誤的數據綁定下方的mvvm模式?將datagrid綁定到viewmodel

我看到的是一個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中的第一項你對你的數據網格的定義應該是

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

你必須關閉的AutoGenerateColumns你的DataGrid和聲明自己的列,以顯示任何你想要的。

至於選擇您的項目,您可以將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

相關問題