none
在silverlight3里面更改datagrid选定行的颜色。 RRS feed

  • 问题

  • 被这个问题搞得头都大了。现在的silverlight3里面的datagrid提供的事件里面鲜有row相关的,有的也对这个问题用不上。

    问题背景如下:
    现在页面上有一个datagrid控件,里面有多行数据。我现在有三个button,green_button,red_button,blue_button.我选中
    datagrid的一行或者多行,然后点击三个button中的任何一个,被选过的datagrid的行就会变成相应的背景色。请问该怎么实现呢?

    谢谢啊,已经折磨我多天了!
    2010年1月22日 5:17

答案

  • 你好,
     
          我用Reflector看了下,他有个internal class来设置selectedItems. 
        
          所以用继承+VisualTreeHelper的方式做了, 下边是我的DataGrid, 多了一个AllRows属性获得所有已经载入的行对象. 
        
        

        public class MyDataGrid:DataGrid
    
        {
    
            public override void OnApplyTemplate()
    
            {
    
                base.OnApplyTemplate();
    
               
    
            }
    
    
    
            public List<DataGridRow> AllRows
    
            {
    
                get { return (List<DataGridRow>)GetValue(AllRowsProperty); }
    
                set { SetValue(AllRowsProperty, value); }
    
            }
    
    
    
            // Using a DependencyProperty as the backing store for AllRows.  This enables animation, styling, binding, etc...
    
            public static readonly DependencyProperty AllRowsProperty =
    
                DependencyProperty.Register("AllRows", typeof(List<DataGridRow>), typeof(MyDataGrid), null);
    
    
    
            public MyDataGrid() : base() {
    
                AllRows = new List<DataGridRow>();
    
            }
    
    
    
            protected override void OnLoadingRow(DataGridRowEventArgs e)
    
            {
    
     	   base.OnLoadingRow(e);
    
                AllRows.Add(e.Row);             
    
            }
    
            protected override void OnUnloadingRow(DataGridRowEventArgs e)
    
            {
    
                base.OnUnloadingRow(e);
    
                AllRows.Remove(e.Row);
    
            }  
    
        }
    
    
           然后再页面的按钮事件中用SelectedItems和AllRows对象比,找到Allrows中已经选定的改变其child DataGridFrozenGrid的背景色. 
          
           这样做就是不用每次都去遍历visual tree了.

    版主大人,能贴出代码吗?我实在愚笨,不知道该怎么处理。谢谢先!
    • 已标记为答案 ascap 2010年4月13日 10:14
    2010年2月4日 6:41

全部回复

  • 你好,
      
          我认为,继承DataGrid来实现是比较好的。 
       
          不继承的花你可以这样实现,在button按钮事件里通过visualTreeHelper去找DataGridRow类型的对象。 然后通过与selectedItems对比DataContext得知哪些要变色。 
     
          推荐工具:silverlightSpy观察客户端具体由什么元素组成(DataGridRow对象的具体名字我忘了,所以你可以这个观察下),
      
          另:你可以写一个VisualTreeHelper的Generic方法遍历visual tree(这个网上也有很多例子)
    2010年1月25日 1:37
  • 谢谢Min-Hong的答复,如果继承了datagrid应该怎么来实现呢?
    2010年1月25日 2:14
  • 你好,
     
          我用Reflector看了下,他有个internal class来设置selectedItems. 
        
          所以用继承+VisualTreeHelper的方式做了, 下边是我的DataGrid, 多了一个AllRows属性获得所有已经载入的行对象. 
        
        

        public class MyDataGrid:DataGrid
        {
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
               
            }
    
            public List<DataGridRow> AllRows
            {
                get { return (List<DataGridRow>)GetValue(AllRowsProperty); }
                set { SetValue(AllRowsProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for AllRows.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty AllRowsProperty =
                DependencyProperty.Register("AllRows", typeof(List<DataGridRow>), typeof(MyDataGrid), null);
    
            public MyDataGrid() : base() {
                AllRows = new List<DataGridRow>();
            }
    
            protected override void OnLoadingRow(DataGridRowEventArgs e)
            {
     	   base.OnLoadingRow(e);
                AllRows.Add(e.Row);             
            }
            protected override void OnUnloadingRow(DataGridRowEventArgs e)
            {
                base.OnUnloadingRow(e);
                AllRows.Remove(e.Row);
            }  
        }
           然后再页面的按钮事件中用SelectedItems和AllRows对象比,找到Allrows中已经选定的改变其child DataGridFrozenGrid的背景色. 
          
           这样做就是不用每次都去遍历visual tree了.
    2010年1月29日 7:31
  • 谢谢,我现在发现我不知道该怎么引用你的MyDataGrid?请指点,谢谢!
    2010年2月2日 9:47
  • 你好,
     
          我用Reflector看了下,他有个internal class来设置selectedItems. 
        
          所以用继承+VisualTreeHelper的方式做了, 下边是我的DataGrid, 多了一个AllRows属性获得所有已经载入的行对象. 
        
        

        public class MyDataGrid:DataGrid
    
        {
    
            public override void OnApplyTemplate()
    
            {
    
                base.OnApplyTemplate();
    
               
    
            }
    
    
    
            public List<DataGridRow> AllRows
    
            {
    
                get { return (List<DataGridRow>)GetValue(AllRowsProperty); }
    
                set { SetValue(AllRowsProperty, value); }
    
            }
    
    
    
            // Using a DependencyProperty as the backing store for AllRows.  This enables animation, styling, binding, etc...
    
            public static readonly DependencyProperty AllRowsProperty =
    
                DependencyProperty.Register("AllRows", typeof(List<DataGridRow>), typeof(MyDataGrid), null);
    
    
    
            public MyDataGrid() : base() {
    
                AllRows = new List<DataGridRow>();
    
            }
    
    
    
            protected override void OnLoadingRow(DataGridRowEventArgs e)
    
            {
    
     	   base.OnLoadingRow(e);
    
                AllRows.Add(e.Row);             
    
            }
    
            protected override void OnUnloadingRow(DataGridRowEventArgs e)
    
            {
    
                base.OnUnloadingRow(e);
    
                AllRows.Remove(e.Row);
    
            }  
    
        }
    
    
           然后再页面的按钮事件中用SelectedItems和AllRows对象比,找到Allrows中已经选定的改变其child DataGridFrozenGrid的背景色. 
          
           这样做就是不用每次都去遍历visual tree了.

    版主大人,能贴出代码吗?我实在愚笨,不知道该怎么处理。谢谢先!
    • 已标记为答案 ascap 2010年4月13日 10:14
    2010年2月4日 6:41