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

Wpf 如何在ListView中设置特定ityem的图像路径?,wpf,xaml,Wpf,Xaml,我有一个列表视图的按钮元素,如下所示: <ListView ItemsSource="{Binding NumberOfItems}" SelectedItem="{Binding SelectedItem}"> <ListViewItem > <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlig

我有一个
列表视图
按钮
元素,如下所示:

<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="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}
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...
}
public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}
<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>
但它没有成功

我要说的是,我使用MVVM


如何解决这个问题?

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

<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="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}
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...
}
public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}
<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>
现在您需要一个ValueConverter,它将切换的布尔值转换为您的图像。称它为ToggledToImageConverter 您可以相应地实现它,并使它成为某个地方的资源

现在,您的ListView如下所示:

<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="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}
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...
}
public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}
<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切换图像。

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

<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="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}
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...
}
public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}
<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>
现在您需要一个ValueConverter,它将切换的布尔值转换为您的图像。称它为ToggledToImageConverter 您可以相应地实现它,并使它成为某个地方的资源

现在,您的ListView如下所示:

<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="{Binding DataContext.Listview.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}
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...
}
public ObservableCollection<ToggleableWrapper<int>> NumberOfItems {get;}
<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>


因此,当您单击按钮时,布尔值被切换,然后将使用ValueConverter切换图像。

ItemsSource
NumberOfItems
包含哪些对象?现在它只是整数,但我可以将其更改为其他任何对象。ItemsSource
NumberOfItems
包含哪些对象?现在它只是整数,但我可以把它换成其他任何东西。