2012-03-13 128 views
0

我的應用程序在啓動時使用從數據庫中檢索的數據填充DataGrid。我的字段是:姓名,ID和狀態。前兩個沒有問題,但第三個(狀態)是一個int,可以是1或0,表示有效或無效。DataGrid排序/更新問題

我決定創建一個用戶控件來顯示「狀態」欄。根據「狀態」的值,它只不過是一個變成綠色或紅色的圓圈。控件的默認顏色是紅色。

我還創建了一個列表對象(「數據」),它包含我的信息以及與它的相應的顏色控制。到目前爲止沒有問題。一切正常,如果我快速觀察我的數據對象,所有事情都應該如此。

我的問題是,經過我填充「myDataGrid.ItemsSource =數據的」數據網格,每一個控制「狀態」顯示爲紅色,當他們中的一些應爲綠色。如果我在任何給定時間斷點並快速觀看我的「數據」對象,一切都很好,但DataGrid不會更新。 排序也一樣。如果更改任何控件的顏色,排序任何列後,它會將所有用戶控件的顏色重置爲默認(紅色)。

幾個測試和研究,我覺得現在的問題是,在DataGrid更新自己的項目源端和instanciates,而不是用我的數據對象的那些新的用戶控件後。

有沒有辦法解決這個問題?我已經嘗試了一些我在網絡上發現的解決方案,但迄今爲止沒有任何工作!

回答

1

讓我們假設你的類看起來是這樣的......

public class MyObject 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
    public int Status { get; set; } 
    public UserControl StatusControl { get; } 
} 

是我的假設是否正確?

如果是這樣,我有幾個建議

  1. 實施INotifyPropertyChanged事件,提高了名稱,ID和狀態屬性的屬性chnaged通知。
  2. 擺脫你UserControl類型(即StatusControl)從你的模型屬性(即MyObject類)
  3. 不要使用AutogenerateColumns爲真(默認情況下爲真)在DataGrid上。創建特定的列...

    <tk:DataGrid x:Name="MyDataGrid" 
           ItemsSource="{Binding MyObjects}" 
           AutoGenerateColumns="False"> 
         <tk:DataGrid.Columns> 
          <tk:DataGridTextColumn Header="ID" 
               Binding="{Binding ID}" /> 
          <tk:DataGridTextColumn Header="Name" 
               Binding="{Binding Name}" /> 
          <tk:DataGridTemplateColumn Header="Status" 
                SortMemberPath="Status"> 
           <tk:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <ns:StatusControl> 
             <ns:StatusControl.Style> 
              <Style TargetType="{x:Type ns:StatusControl}"> 
               <Setter Property="IndicatorColor" 
                 Value="Green"/> 
               <Style.Triggers> 
                <DataTrigger Binding="{Binding Status}" 
                   Value="1"> 
                 <Setter Property="IndicatorColor" 
                   Value="Red"/> 
                </DataTrigger> 
               </Style.Triggers> 
              </Style>           
             </myNamespace:StatusControl.Style> 
            </myNamespace:StatusControl> 
           </DataTemplate> 
          </tk:DataGridTemplateColumn.CellTemplate> 
         </tk:DataGridTemplateColumn> 
        </tk:DataGrid.Columns> 
    <tk:DataGrid> 
    

這裏用戶控件(如StatusControl),應露出一個Brush屬性(像IndicatorColor),因此,基於現狀,Fill顏色的圓圈中用戶控件(請參閱DataTrigger)將會更改。

因此,當您收到StatusMyObject屬性的更新時,DataTrigger將更新用戶控件的顏色。

希望這有助於...

+0

我用你的第二recomendation和擺脫從我的目標我的用戶控制的,然後我去細胞通過在該列的小區中以一個更新的狀態控制之一,它的工作原理精細。但是,當我對任何給定的列進行排序時,它會將每個控件重置爲默認填充(紅色)。我知道DataGrid.Sorting事件,但它不起作用。有沒有其他方法可以解決這個問題? 如果有問題,所有列都是隻讀,不知道是否有幫助... 順便說一句,感謝您的回覆! – David 2012-03-13 21:34:15

+0

@David,你是否看到我指定的排序成員路徑模板列?解決你所告訴我的這個問題是令人興奮的。 Datagrid的排序只發生在單元**表示的**數據上,而不是單元**具有或包含**的數據。 'SortMemberPath'專門用於數據網格的排序功能。因爲你沒有使用它,所以排序不會像你期望的那樣發生。 – 2012-03-14 05:15:10

+0

對不起,我遲到了。其實我看到了,但只有在我發表我最後的評論之後:P。我在INotifyPropertyChanged實現方面掙扎了一下,但在解決它之後,我又回到了這裏,幾乎將XAML代碼複製到了我的。它很棒! 非常感謝 – David 2012-03-14 20:15:45