none
WPF DataGrid RowHeader如何改变图片来源? RRS feed

  • 问题

  • 问题如下:

    DataGrid显示一个多行数据,每行3列。第一列是一个图片(暂命名为图片1),第二列是“附件名称”,第三列“修改日期”。

    现在想点击某一行,该行的第一列的图片1切换为图片2.  不选中的时候,图片源仍然为图片1.

    DataGrid的代码如下:

    <DataGrid Name="dataGrid1" AutoGenerateColumns="False" Height="235" HorizontalAlignment="Left"
                      Margin="42,30,0,0"  VerticalAlignment="Top" Width="387"
                      ItemsSource="{Binding}" CanUserAddRows="False"
                      DataContext="{Binding}" SelectionChanged="dataGrid1_SelectionChanged" SelectionUnit="CellOrRowHeader">
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate >
                            <DataTemplate >
                                <Image Width="20" Height="20" Source="image_1.jpg"></Image>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridHyperlinkColumn Header="附件名称" Width="197" Binding="{Binding Path=_name, Mode=TwoWay}" />
                    <DataGridTextColumn Header="修改日期" Width="80"
                           Binding="{Binding Path=_time,Mode=TwoWay}"/>
               </DataGrid.Columns>
            </DataGrid>

    第一个想法是用触发器,修改image的source为image2,但是不知道怎么使用Datagrid的行的Isselected属性作用到Image上。

    第二个想法是在后台的DataGrid:SelectedChanged中修改Image的图片源。但是在函数中,不知如何索引到该行的Image控件。

    请问这个问题如何解决?

    2011年1月16日 15:52

答案

  • MoonTracer,

    你好!欢迎来到MSDN论坛,希望在这里你可以解决问题并且和社区成员进行技术上的交流。

    关于你的问题,你可以使用以下代码实现你的功能,即在DataGridTemplateColumn的CellTemplate中找到DataGrid当前选中行的IsSelected属性。

    {Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}
    
    
    

    这里我们使用的是RelativeSource,通过它可以绑定相对于绑定目标的位置。详细信息你可以参考http://msdn.microsoft.com/zh-cn/library/system.windows.data.relativesource.aspx

    下面我写的一个简单的示例程序,

    XAML:

    <Window x:Class="WpfApplication26.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication26"
        Title="MainWindow" Height="350" Width="525">
      <Window.Resources>
        <local:SourceConverter x:Key="Con"></local:SourceConverter>
      </Window.Resources>
      <Grid>
        <DataGrid Name="dataGrid1" AutoGenerateColumns="False" Height="235" HorizontalAlignment="Left"
             Margin="42,30,0,0" VerticalAlignment="Top" Width="387"
             ItemsSource="{Binding}" CanUserAddRows="False" 
             DataContext="{Binding}" SelectionUnit="CellOrRowHeader">
          <DataGrid.Columns>
            <DataGridTemplateColumn>
              <DataGridTemplateColumn.CellTemplate >
                <DataTemplate >
                  <Image Width="20" Height="20"
                      Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}},Converter={StaticResource Con}, 
                    Path=IsSelected}">                
                  </Image>             
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridHyperlinkColumn Header="附件名称" Width="197" Binding="{Binding Path=Name, Mode=TwoWay}" />
            <DataGridTextColumn Header="修改日期" Width="80" 
                Binding="{Binding Path=Time,Mode=TwoWay}"/>
          </DataGrid.Columns>
        </DataGrid>
      </Grid>
    </Window>
    
    

    后台代码:

    using System;
    using System.Windows;
    using System.Windows.Data;
    using System.Collections.ObjectModel;
    using System.Globalization;
    
    namespace WpfApplication26
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public ObservableCollection<CustomItem> CustomList { get; set; }
        public MainWindow()
        {
          InitializeComponent();
          CustomList = new ObservableCollection<CustomItem>()
          {
            new CustomItem(){Name="A",Time="2010/1/1"},
            new CustomItem(){Name="B",Time="2010/2/1"},
            new CustomItem(){Name="C",Time="2010/3/1"},
            new CustomItem(){Name="D",Time="2010/4/1"},
            new CustomItem(){Name="E",Time="2010/5/1"},
          };
          dataGrid1.DataContext = CustomList;
        }
      }
      public class CustomItem
      {
        public string Name { get; set; }
        public string Time { get; set; }
      }
      public class SourceConverter : IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          if ((bool)value == true)
            return "star.jpg";
          else
            return "BW.jpg";
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          throw new NotImplementedException();
        }
      }
    }
    
    

    你也可以在这里找到一份完整的工程文件 http://cid-e52a44742984b88f.office.live.com/self.aspx/.Documents/DataGridBinding.zip

    希望这条信息对你有所帮助!

    致,


    Yves Zhang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 MoonTracer 2011年1月21日 3:27
    2011年1月19日 13:51
    版主