2012-03-13 64 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