如何在ListView中设置特定ityem的图像路径?

时间:2016-04-18 08:49:12

标签: wpf xaml

我有Button<ListView ItemsSource="{Binding NumberOfItems}" SelectedItem="{Binding SelectedItem}"> <ListViewItem > <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent" Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"> <Button.Template> <ControlTemplate> <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg"> <Image Source="{Binding DataContext.Test_ImagePath, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"/> </Grid> </ControlTemplate> </Button.Template> </Button> </ListViewItem > </ListView> 元素,如下所示:

CommandTarget

我的目标是让按钮的图像在按钮点击时在两个图像路径之间切换。它可以工作,但问题是列表中的所有按钮都会在某些按钮单击时更改图像路径。我只想点击一个来改变图像路径。我尝试使用CommandTarget="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}} 这样的属性:

xls.Range("A7").Offset(1).EntireRow.Insert

但它没有成功。

提一下我使用MVVM。

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

如果您正在使用MVVM,我想您可以使用这样的包装器包装您的模型(如您所说,现在为整数):

public class ToggleableWrapper<T> : INotifyPropertyChanged {
    private bool toggled;

    public ToggleableWrapper(T item){
        this.Item = item;
        this.ClickCommand = new RelayCommand(() => this.Toggled = !this.Toggled);
    }

    public T Item {get;}
    public ICommand ClickCommand {get;}

    public bool Toggled {
        get { return this.toggled; }
        set { 
            this.toggled = value;
            OnPropertyChanged(nameof(this.Toggled));
        }
    }

    //Property changed implementation...
}

因此,您的NumberOfItems集合可能如下所示:

public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}

现在您需要一个ValueConverter,它将切换的布尔值转换为您的图像。称之为ToggledToImageConverter 您可以相应地实现它并使其成为某个地方的资源。

现在你的ListView看起来像这样:

<ListView ItemsSource="{Binding NumberOfItems}" SelectedItem="{Binding SelectedItem}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent" Command="{Binding ClickCommand}">
                <Button.Template>
                    <ControlTemplate>
                        <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg">
                            <Image Source="{Binding Toggled, Converter={StaticResouce ToggledToImageConverter}"/>
                        </Grid>
                    </ControlTemplate>
                </Button.Template>
             </Button>
         <DataTemplate>
    </ListView.ItemTemplate>
</ListView>

因此,当您单击该按钮时,将切换bool,然后使用ValueConverter切换图像。