2013-03-08 59 views
3

大家好,我是WPF新手,我已经使用列表视图呈现为网格视图。我有一个图像列,我通过绑定路径来设置一个值。现在的问题是我需要根据条件改变图像的路径。如果条件为真,我需要图像的路径不同。如果为false,我将其更改为另一个路径。这可以一行一行地完成吗?以下是我的列表视图。请帮助动态更改ListView中图像的路径

<ListView Name="LstGrd" Margin="0,105,0,138"> 
    <ListView.View> 
     <GridView > 
      <GridViewColumn Header=" Name" Width="120" DisplayMemberBinding="{Binding Path=Name}" /> 
      <GridViewColumn Header=" Address" Width="250" DisplayMemberBinding="{Binding Path=Address}" /> 
      <GridViewColumn Header=" City" Width="50" DisplayMemberBinding="{Binding Path=City}" /> 
      <GridViewColumn Header=" State" Width="75" DisplayMemberBinding="{Binding Path=State}" /> 
      <GridViewColumn Header=" PostalCode" Width="75" DisplayMemberBinding="{Binding Path=PostalCode}" /> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Image Width="16" Name="Test" Height="16" Source="{Binding Path=ImagePath,Mode=TwoWay}"/> 
          <TextBlock Text="Status"/> 
         </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

回答

2

如果我正确理解你的问题,如果有一些条件,你想改变图像在变化。我创建了一个你绑定到你的列表视图的类的虚拟版本,并添加了一个名为“IsSelected”的属性来显示它。

<ListView Name="LstGrd" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <ListView.View> 
     <GridView > 
      <GridViewColumn Header=""> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsSelected}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header=" Name" Width="120" DisplayMemberBinding="{Binding Path=Name}" /> 
      <GridViewColumn Header=" Address" Width="250" DisplayMemberBinding="{Binding Path=Address}" /> 
      <GridViewColumn Header=" City" Width="50" DisplayMemberBinding="{Binding Path=City}" /> 
      <GridViewColumn Header=" State" Width="75" DisplayMemberBinding="{Binding Path=State}" /> 
      <GridViewColumn Header=" PostalCode" Width="75" DisplayMemberBinding="{Binding Path=PostalCode}" /> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
         <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Image Width="16" Name="Test" Height="16" Source="{Binding Path=ImagePath,Mode=TwoWay}"/> 
          <TextBlock Text="Status"/> 
         </StackPanel> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
           <Setter Property="Source" Value="{Binding Path=ImagePath2}" TargetName="Test" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

这里要注意的是,我添加了一列(这是可选的 - 我只是这样做,使它更容易演示)。然后,在您的图像列中,您需要将DataTrigger添加到您的DataTemplate以处理该属性更改。

这里只是DataTemplate中:

<DataTemplate> 
    <StackPanel Orientation="Horizontal"> 
     <Image Width="16" Name="Test" Height="16" Source="{Binding Path=ImagePath,Mode=TwoWay}"/> 
     <TextBlock Text="Status"/> 
    </StackPanel> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
      <Setter Property="Source" 
        Value="{Binding Path=ImagePath2}" 
        TargetName="Test" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

它的优点在转换器,因为它是一个唯一的XAML实现。

+0

只有在绑定到grid.ie后,条件才会更改。我仅在将图像默认绑定到网格后才检查条件。在此方案中将执行此工作(根据条件逐行更改图像)。如果我听起来很愚蠢这是新的。 – Karthik 2013-03-08 14:12:35

+0

每个GridViewColumn定义所做的是控制如何显示特定行中的特定单元格。你正在显示这个名字,这个地址等等。在DataTemplate的情况下,你正在控制如何在这个单元格中显示这段数据(即你正在显示为你的“Contact”类的这个实例定义的ImagePath) 。 DataTrigger正在做的是检查此实例的另一个属性,并使用ImagePath2替换此图像。所以,是的,它会根据这个条件逐行改变它。 – 2013-03-08 14:17:12

+0

对不起,麻烦你我有另一个问题是什么时候Datatrigger叫。它只是在数据绑定期间..或者用这种方式我需要更改按钮上的图像单击数据trriger如何在该场景中实现。感谢您的帮助 – Karthik 2013-03-08 14:29:38

0

你应该使用一个转换器:

<Image Source="{Binding Path = ImagePath, Mode = TwoWay, Converter={StaticResource imageToValidatedImageConv}}" /> 

哪里imageToValidatedImageConv是定义为一个资源:<local:ImageToValidatedImageConverter x:Key="imageToValidatedImageConv" />

和你的转换器类,如:

public class ImageToValidatedImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if() 
      { 
       //return image1 
      } 
      else 
      { 
       //return image2 
      } 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new Exception("Cant convert back"); 
     } 
    } 
+0

这可以实现,如果我必须改变按钮click.Please指南 – Karthik 2013-03-08 14:32:18

+0

不知道我是否按照你假装。 IValueConverter接口为您提供了一种将自定义逻辑应用于绑定的方法。如果您打算根据按钮事件更改图像,请点击按钮,您可以像平常一样进行操作 – Santux 2013-03-08 14:43:02

+0

您可以请我演示如何在按钮单击列表视图中更改图像或指向某些文章。谢谢您的支持帮助 – Karthik 2013-03-08 14:46:25