2017-01-25 112 views
0

我的工作與DB前端WPF /的EntityFramework/MVVMWPF DataGrid的定製行頭

現在我卡住了,當我允許用戶將數據添加到一個DataGrid(其綁定到一個觀察的集合)。

我想達到的目標,是讓行標題就像在MS Access: 所以我的WPF的DataGrid應該是這樣的基本上是:

access datagrid

有沒有綁定任何方式RowHeaderStyle到RowState? 例如:

  • RowState.Editing:顯示編輯圖標
  • RowState.NewRow:秀明星
  • RowState.Default:顯示默認的行標題

我發現沒有解決方案,到目前爲止,但我認爲WPF應該足夠強大才能完成這項工作。

謝謝!

+0

P.S:我不關心交替行的顏色,我知道這可以通過設置'AlternatingRowBackground'in DataGrid中 – CeOnSql

回答

1

簡單。根據DataGridRow的狀態,給DataGrid一個RowHeaderStyle交換不同的ContentTemplates。幸運的是,DataGridRowDataGridRowHeader的可視祖先,因此使用RelativeSource綁定到達那裏並獲取相關屬性的值相對簡單:DataGridRow.IsEditingDataGridRow.IsNewItem

我使用<Label>New</Label>等作爲任何你想使用的內容的立場。

<DataGrid 
    ItemsSource="{Binding Rows}" 
    > 
    <DataGrid.RowHeaderStyle> 
     <Style 
      TargetType="{x:Type DataGridRowHeader}" 
      BasedOn="{StaticResource {x:Type DataGridRowHeader}}" 
      > 
      <!-- 
      Empty content template for default state. 
      Triggers below replace this for IsNewItem or IsEditing. 
      --> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Label></Label> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 

      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding 
         IsEditing, 
         RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" 
        Value="True" 
        > 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Label>Edit</Label> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 

       <DataTrigger 
        Binding="{Binding 
         IsNewItem, 
         RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" 
        Value="True" 
        > 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Label>New</Label> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowHeaderStyle> 
</DataGrid>    
+0

做感謝您的回答,但似乎並沒有工作。也許有綁定到'RowState'的問題。觸發器'綁定=「{Binding RowState}」Value =「EditRow」'例如從來沒有在我看來發射!? – CeOnSql

+0

@CeOnSql我不得不做出假設,因爲你沒有包含關於你的viewmodels的很多信息。行項目上的RowState屬性是什麼?它被稱爲'RowState'嗎?當它的值改變時它會引發'INotifyPropertyChanged.PropertyChanged'嗎?如果您共享行項目類本身的來源,那將回答這些問題。 –

+0

我想你錯了'RowState'不是我的基礎對象的屬性!使用'RowState'我的意思是DataGrid的屬性(如果這是現有的!?) – CeOnSql