locked
Datagrid问题 RRS feed

  • 问题

  • 一个DataGrid,包含一个DataGridTemplateColumn,在其CellTemplate中包含一个HyperlinkButton,在HyperlinkButton的click事件代码中,我改变这个HyperlinkButton的Content及Foreground属性。

     运行程序,点击第一行的HyperlinkButton,其文字内容及颜色都改变了。

    点击第二行的HyperlinkButton,其文字内容及颜色也都改变了。

    然后将滚动条往下拉,发现下面有几行的HyperlinkButton也改变了。

     <my:DataGrid AutoGenerateColumns="True" x:Name="grid" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" Height="400" >
          <my:DataGrid.Columns>
            <my:DataGridTemplateColumn Header="Show/Hide Details" Width="100" >
              <my:DataGridTemplateColumn.CellTemplate >
                <DataTemplate >
                  <Grid>
                    <HyperlinkButton Content="【Show Details】" x:Name="btn_showDetails" Click="btn_showDetails_Click" HorizontalAlignment="Center" VerticalAlignment="Center" ></HyperlinkButton>
                  </Grid>
                </DataTemplate>
              </my:DataGridTemplateColumn.CellTemplate>
            </my:DataGridTemplateColumn>
          </my:DataGrid.Columns>
        </my:DataGrid>
    

     

    public MainPage()
        {
          InitializeComponent();
          bindData();
        }
    
        
        
        private void bindData()
        {
          ObservableCollection<int> data = new ObservableCollection<int>();
          for (int i = 0; i < 60; i++)
            data.Add(i);
          grid.ItemsSource = data;
        
        }
    
        private void btn_showDetails_Click(object sender, RoutedEventArgs e)
        {
          ButtonBase btn = sender as ButtonBase;
          if (btn.Content.ToString() == "【Show Details】")
          {
            btn.Content = "【Hide Details】";
            btn.SetValue(ButtonBase.ForegroundProperty, new SolidColorBrush(Colors.Red));
          }
          else
          {
            btn.Content = "【Show Details】";
            btn.SetValue(ButtonBase.ForegroundProperty, DependencyProperty.UnsetValue);
    
          }
        }
    
    2010年10月14日 2:12

答案

  • 如果你愿意换一种思路,这个问题就很好解决。

    1)你的DataSourceItem里面多增加些控制属性,如:

    private _ButtonCaption="[Show Details]";

    public string ButtonCaption {get{return _ButtonCaption;} set{_ButtonCaption=value;}}

    2)那个HyperLinkButton搞点绑定,如:

    Content={Binding Path=ButtonContent, Mode=TwoWay}

    3)在你的Click事件里面这样搞

    //YouDataGrid是那个Grid的名称,具体什么名称我不晓得

    //YouDataSourceItem是你绑定DataGrid的数据源的实体类名,具体我就不知道了

    private void btn_showDetails_Click(object sender, RoutedEventArgs e)
        {
            var X=YourDataGrid.SelectedItem as YourDataSourceItem;

           X.ButtonCaption = X.ButtonCaption == "[Show Detail]"?"[Hide Detail]":"[Show Detail]";    

       }

    4)至于颜色等的控制依葫芦画瓢搞定。

    注意:要通过绑定来搞。而不是直接改变按钮的Content或者Foreground等,因为他是一个模板,所以按你的方法就会所有行是一样的。

    当然这样搞,你要求的功能或效果是一定能实现的,只是你不一定喜欢。如果你觉得喜欢,你就说声谢谢,你觉得不要,你就提点更好的办法。

    • 已标记为答案 Mog Liang 2010年10月21日 9:45
    2010年10月14日 12:07

全部回复

  • 如果你愿意换一种思路,这个问题就很好解决。

    1)你的DataSourceItem里面多增加些控制属性,如:

    private _ButtonCaption="[Show Details]";

    public string ButtonCaption {get{return _ButtonCaption;} set{_ButtonCaption=value;}}

    2)那个HyperLinkButton搞点绑定,如:

    Content={Binding Path=ButtonContent, Mode=TwoWay}

    3)在你的Click事件里面这样搞

    //YouDataGrid是那个Grid的名称,具体什么名称我不晓得

    //YouDataSourceItem是你绑定DataGrid的数据源的实体类名,具体我就不知道了

    private void btn_showDetails_Click(object sender, RoutedEventArgs e)
        {
            var X=YourDataGrid.SelectedItem as YourDataSourceItem;

           X.ButtonCaption = X.ButtonCaption == "[Show Detail]"?"[Hide Detail]":"[Show Detail]";    

       }

    4)至于颜色等的控制依葫芦画瓢搞定。

    注意:要通过绑定来搞。而不是直接改变按钮的Content或者Foreground等,因为他是一个模板,所以按你的方法就会所有行是一样的。

    当然这样搞,你要求的功能或效果是一定能实现的,只是你不一定喜欢。如果你觉得喜欢,你就说声谢谢,你觉得不要,你就提点更好的办法。

    • 已标记为答案 Mog Liang 2010年10月21日 9:45
    2010年10月14日 12:07
  • 首先谢谢你的回复。

    你说的方法,其实我试过,确实能解决我上面提出的问题。

    实际项目中,除了需要改变HyperlinkButton外,还要改变DataGridRow的DetailsVisibility属性,而且会动态从数据源中删除一些条目。 当通过点击HyperlinkButton改变了几个DataGridRow的DetailsVisibility后,从数据源中删除一条, 就会发现一些DataGridRow本该是展开明细的,却没有展开;另一些不该展开的却展开了。

    在xmal中还没法绑定DetailsVisibility属性,我试过在LoadingRow事件中添加绑定,也不行。

    2010年10月15日 8:50
  • 最重要的思路,应该是从绑定(包括事件)入手考虑怎么解决;同时尽可能用新版本Silverlight。
    http://www.cnblogs.com/2gua
    2010年10月16日 22:43
  • Datagrid做了一些优化,使其只创建显示的Row,并且重用Row的实例,你所遇到的问题应该也是由此导致的。解决的办法如TFSoft所说,可以使用Binding,对于复杂属性的binding,比如Visibility,你可以借助ValueConverter。

     


    Mog Liang
    2010年10月18日 6:02