从列表中设置WPF图像源<基于组合框选择

本文关键字:于组合 组合 选择 列表 设置 WPF 图像 | 更新日期: 2023-09-27 18:17:23

我有一个SearchResponse类返回到我的viewmodel。

public class SearchResponse
{
    public ICollection<SearchResult> Results { get; private set; }
    public string OriginalSearchTerm { get; private set; }
    public TimeSpan TimeTaken { get; private set; }
    public SearchResponse(ICollection<SearchResult> results, string originalSearchTerm, TimeSpan timeTaken)
    {
        Results = results;
        OriginalSearchTerm = originalSearchTerm;
        TimeTaken = timeTaken;
    }
}

列表框绑定到SearchResponse.Results,每个项包含缩略图的图像。SearchResult看起来像这样:

public class SearchResult
{
    public string Title { get; set; }
    public string Description { get; set; }
    public string Path { get; set; }
    public ICollection<ThumbnailImage> ThumbnailPaths { get; set; }
    public SearchResult()
    {
    }
    public SearchResult(string title, string description, string path, ICollection<ThumbnailImage> thumbnailPaths)
    {
        Title = title;
        Description = description;
        Path = path;
        ThumbnailPaths = thumbnailPaths;
    }
}

这里是ThumbnailImage (ThumbnailSize是一个enum):

public class ThumbnailImage
{
    public int Id { get; set; }
    public ThumbnailSize ThumbnailSize { get; set; }
    public string Path { get; set; }
    public ThumbnailImage()
    {
    }
    public ThumbnailImage(ThumbnailSize thumbnailSize, string path)
    {
        ThumbnailSize = thumbnailSize;
        Path = path;
    }
}

最后,我将一个ComboBox绑定到缩略图大小的枚举,目的是当用户选择一个大小时,搜索结果中的缩略图图像立即相应地改变。因此,当发生这种情况时,我需要查询ICollection<ThumbnailImage>以获取正确的文件路径,更新图像宽度和高度(每个缩略图大小的固定宽度/高度)并将更改应用于整个结果列表。

<ComboBox DockPanel.Dock="Right"
                  ItemsSource="{Binding Source={StaticResource ThumbnailSizesFromEnum}}"
                  SelectedItem="{Binding CurrentThumbnailSize}">
        </ComboBox>

我有一个工作绑定CurrentThumbnail属性,如上所示。

谁能建议最好的(或至少是好的)方法来处理这个问题?目前我只是因为阅读太多而头痛,试图找到一个解决方案。我想知道我是否应该使用命令,值转换器或StyleTrigger,但无论哪种方式,我真的需要一些指针。

谢谢。

从列表中设置WPF图像源<基于组合框选择

我有一些困难以下项目的层次结构,你正在显示,但我相信你正在寻找的答案很简单:你必须实现INotifyPropertyChanged接口上的类(或类),包含属性,你将改变响应在CurrentThumbnail的变化。正如我对您的问题的理解,当当前选择的大小发生变化时,您并不怀疑如何更新缩略图数据,您只是想知道如何将您已更改数据的事实传达给数据绑定。这就是INotifiyPropertyChanged的作用

例如,这个版本的ThumbnailImage将把Path属性的变化通知到绑定到Path的任何XAML属性:

public class ThumbnailImage : INotifyPropertyChanged
{
    private string _path;
    public string Path
    {
        get { return _path; }
        set
        {
            if (value != _path)
            {
                _path = value;
                if (PropertyChanged != null)
                {
                    var args = new PropertyChangedEventArgs("Path");
                    PropertyChanged(this, args);
                }
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

我还建议您确保用于表示所显示的数据的类的层次结构(所有这些类本质上都是视图模型的一部分)应该与XAML的层次结构匹配。很难说,因为您没有给我们完整的XAML布局,但我怀疑您的数据模型可能太复杂了。换句话说,考虑平坦化数据树。