【问题标题】:DataGrid Sort/Update IssueDataGrid 排序/更新问题
【发布时间】:2012-03-13 11:59:54
【问题描述】:

我的应用程序在启动时会使用从数据库中检索到的数据填充 DataGrid。我的字段是:姓名、ID 和状态。前两个没问题,但是第三个(Status)是一个int,1或者0,表示active或者inactive。

我决定创建一个用户控件来显示“状态”字段。它只不过是一个圆圈,根据“状态”的值变成绿色或红色。控件的默认颜色为红色。

我还创建了一个列表对象(“数据”),其中包含我的信息以及带有相应颜色的控件。到目前为止没有问题。一切正常,如果我快速查看我的数据对象,一切都会正常。

我的问题是,在使用“myDataGrid.ItemsSource = data”填充 DataGrid 后,每个控件“状态”显示为红色,而其中一些应该为绿色。如果我在任何给定时间断点并快速查看我的“数据”对象,一切都很好,但 DataGrid 不会更新。 排序也是如此。如果我更改任何控件的颜色,在对任何列进行排序后,它会将我所有用户控件的颜色重置为默认值(红色)。

经过一些测试和研究,我认为问题在于 DataGrid 在项目源的末尾更新自身并实例化新的用户控件,而不是在我的数据对象上使用这些控件。

有没有办法解决这个问题?我尝试了一些在网上找到的解决方案,但到目前为止都没有奏效!

【问题讨论】:

    标签: wpf sorting wpfdatagrid


    【解决方案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 和状态属性发出属性更改通知。
    2. 从模型(即MyObject 类)中删除UserControl 类型(即StatusControl)属性
    3. 不要在数据网格上将AutogenerateColumns 用作真(默认为真)。创建您的特定列...

       <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) 将会改变。

    这样,当您收到MyObjectStatus 属性的更新时,DataTrigger 将更新用户控件上的颜色。

    希望这会有所帮助...

    【讨论】:

    • 我使用了您的第二次建议并从我的对象中删除了我的用户控件,然后我在该列上逐个单元格地逐个更新了状态控件,它工作正常。但是,当我对任何给定列进行排序时,它会将每个控件重置为其默认填充(红色)。我知道 DataGrid.Sorting 事件,但它不起作用。有没有其他方法可以解决这个问题??如果有关系,所有列都是只读的,不知道有没有帮助...顺便谢谢您的回复!
    • @David,你看到我对模板列指定的排序成员路径了吗?解决你告诉我的这个问题真是太棒了。 Datagrid 的排序仅发生在单元格所代表的数据 上,而不是单元格 具有或包含的内容 上。 SortMemberPath 专门用于数据网格的排序功能。而且由于您没有使用它,因此排序不会按照您期望的方式进行。
    • 抱歉我的回复晚了。实际上我看到了,但只是在我发布了我的最后一条评论之后:P。我在 INotifyPropertyChanged 实现方面有点挣扎,但在我解决它之后,我回到这里,几乎将你的 XAML 代码复制到我的。效果很好!!!非常感谢
    猜你喜欢
    • 2012-08-03
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2010-11-28
    • 2011-11-10
    • 2014-03-26
    相关资源
    最近更新 更多