c# - Listview 选定项目作为图像源
问题描述
我的 WPF 应用程序中有一个列表视图。列表视图中的每一项都是图像文件的路径。我想在列表视图上显示所选图像的缩略图或预览。
主窗口.xaml
<Image Source="{Binding SelectedImage}" />
<ListView x:Name="MyListView" AllowDrop="True" Drop="MyListView_Drop" />
主窗口.xaml.cs
namespace MyWPFApp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MyDataContext();
}
}
private void MyListView_Drop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
List<string> fileList = new List<string>(files);
foreach (string file in fileList)
{
if ((file.ToLower().EndsWith(".jpg") || file.ToLower().EndsWith(".jpeg") && !MyListView.Items.Contains(file))
{
MyListView.Items.Add(file);
}
}
}
public class MyDataContext : INotifyPropertyChanged
{
public string SelectedImage
{
get { return ((KeyValuePair<string, object>?)((MainWindow)Application.Current.MainWindow).MyListView.SelectedItem)?.Value?.ToString(); }
set
{
((MainWindow)Application.Current.MainWindow).MyListView.SelectedItem = value;
OnPropertyChanged(nameof(SelectedImage));
}
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
目前,在列表视图上选择图像不会做任何事情。任何帮助将不胜感激。
解决方案
您的 ListView 未绑定到该SelectedImage
属性。
除此之外,您应该考虑拥有一个实际的视图模型,该模型ObservableCollection
除了属性之外还具有图像文件列表的SelectedImage
属性。
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<string> Images { get; }
= new ObservableCollection<string>();
private string selectedImage;
public string SelectedImage
{
get { return selectedImage; }
set
{
selectedImage = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(SelectedImage)));
}
}
}
您将在 XAML 中绑定到它,如下所示(可能使用 ListBox 而不是 ListView,因为它更简单):
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding Images}"
SelectedItem="{Binding SelectedImage}"
AllowDrop="True" Drop="ListView_Drop"/>
<Image Grid.Column="1" Source="{Binding SelectedImage}" />
</Grid>
窗口后面的代码:
public partial class MainWindow : Window
{
private readonly ViewModel viewModel = new ViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = viewModel;
}
private void ListView_Drop(object sender, DragEventArgs e)
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (var file in files.Where(
f => (f.ToLower().EndsWith(".jpg") || f.ToLower().EndsWith(".jpeg"))
&& !viewModel.Images.Contains(f)))
{
viewModel.Images.Add(file);
}
}
}
推荐阅读
- javascript - React Router 重定向时的动画过渡
- android - 收货人未到达
- android - Android活动场景过渡不同的动画目标
- mysql - Sql存储过程速度问题
- javascript - 使用 Vuetify 缓慢滚动回顶部
- javascript - 在事件 IONIC V1 之后增加 Firebase 子值
- python - 如何使用正则表达式定位文件夹中的文件夹
- java - 更改 JScrollPane 的视图,以便 JEditorPane 的某个部分可见
- android - 使用 webview 在 iframe 中自动播放 youtube 的工作示例?
- vue.js - 为 vuex / nuxtClientInit 创建了钩子?