动态改变ListView中图像的路径
本文关键字:路径 图像 改变 ListView 动态 | 更新日期: 2023-09-27 18:03:11
大家好,我是WPF的新手,我使用列表视图来渲染网格视图。我有一个图像列,我通过绑定路径为其设置一个值。现在的问题是我需要根据一个条件来改变图像的路径。如果条件成立,我需要图像的路径是不同的。如果为false,则将其更改为另一条路径。这能一排一排地做吗?下面是我的列表视图。请帮助
<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>
如果我正确理解你的问题,如果某些条件发生变化,你想要更改图像。我创建了一个虚拟版本的类,你绑定到你的listview,并添加了一个名为"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>
这里需要注意的是,我添加了一个列(这是可选的—我这样做只是为了更容易演示)。然后,在您的Image列中,您需要将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>
与Converter相比,这有一个优点,因为它是一个纯XAML实现。
您应该使用转换器:
<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");
}
}