2010-05-18 64 views
0

我有一個wpf數據網格有很多行,每一行都有一些特定的行爲,如選擇已更改的第1列組合將過濾第2列組合,並且第1行第1列中選擇的組合不能在行中選擇2列1組合等...DataGrid的行和MVVM

所以我想有一個視圖模型的主要數據網格,另一個每行。

這是一個很好的MVVM實現嗎?這樣我就可以有效地處理每一行的變更事件。

問題是,我如何創建「每行」作爲用戶控制視圖?在數據網格中。

我想要實現這樣的事情:

 <TreeView 
     Padding="0,4,12,0"> 

     <controls:CommandTreeViewItem 
      Header="Sales Orders" 
      Command="{Binding SelectViewModelCommand}" 
      CommandParameter="Sales Orders"/>   

    </TreeView> 

哪裏,而不是一個TreeView我希望有一個數據網格,並代替控制:CommandTreeViewItem一個DataGrid行WPF。

在此先感謝。

+0

你爲什麼不使用一個ListView與數據項模板,而不是一個DataGrid? – slugster 2010-05-18 07:00:27

+0

我不想要只讀控件? – Joshscorp 2010-05-18 07:19:07

回答

1
 <my:DataGrid x:Name="locationGrid"> 
      <my:DataGrid.Columns> 
       <my:DataGridTemplateColumn> 
        <my:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=LocationName}"/> 
         </DataTemplate> 
        </my:DataGridTemplateColumn.CellTemplate> 
        <my:DataGridTemplateColumn.CellEditingTemplate> 
          <DataTemplate> 
          <TextBox Text="{Binding Path=LocationName}"/> 
         </DataTemplate> 
        </my:DataGridTemplateColumn.CellEditingTemplate> 
       </my:DataGridTemplateColumn> 
      </my:DataGrid.Columns> 
     </my:DataGrid>  

你可以放在每個DataGrid列幾乎任何你想要的。我在這裏給你例子。你甚至可以定義頭文件模板。如果您製作小程序,則不需要MVVM,但我不明白爲什麼您需要DataGridRow的MV?製作UserControl並將其嵌入到DataTemplate中,併爲UserControl製作VM類。

0

您可以對每行使用DataTemplate並按照您的需要對其進行自定義。

0

只需在視圖的viewModel上的公共屬性中創建視圖模型類的可觀察集合即可。這裏有一個例子

public ObservableCollection<YourViewModelForEachRow> LineItems{ get; private set; } 

您認爲這些數據網格XAML將ItemsSource屬性設置爲財產了LineItem上面創建。

ItemSource="{Binding LineItems"} 

當然,這是假設的DataContext包含在DataGrid已被設置爲您創建了LineItem視圖模型視圖。我這樣做是爲了我的看法。我仍然認爲自己是WPF的新手,但這似乎是MVVM非常乾淨和靈活的方法。所有處理數據輸入,小部件處理等的邏輯都由行視圖模型來處理。

加上你的xaml很乾淨。對我來說一個典型的列定義如下所示(其中LineItemNumber是我LineItemViewModel的公共屬性):

<DataGridTextColumn Binding="{Binding Path=LineItemNumber, StringFormat=000}" 
           ElementStyle="{StaticResource CellRightAlign}" 
           Header="Line No." />