C# 显示ListView中选定图像的新窗口不';我没有访问映像路径的权限
我有一个带有ListView的应用程序,我通过单击AddImage按钮将图像添加到该列表中,我还有一个从该列表中删除图像的按钮。我使用SelecteImage对象来实现这一点,一切都很好。但我希望有一个按钮来显示所选图像,我就是这样做的:C# 显示ListView中选定图像的新窗口不';我没有访问映像路径的权限,c#,wpf,image,listview,mvvm,C#,Wpf,Image,Listview,Mvvm,我有一个带有ListView的应用程序,我通过单击AddImage按钮将图像添加到该列表中,我还有一个从该列表中删除图像的按钮。我使用SelecteImage对象来实现这一点,一切都很好。但我希望有一个按钮来显示所选图像,我就是这样做的: private ObservableCollection<Image> imageList = new ObservableCollection<Image>(); private Image selec
private ObservableCollection<Image> imageList = new ObservableCollection<Image>();
private Image selectedImage = new Image();
public MainViewModel()
{
AddImagesCommand = new RelayCommand(AddImagesMethod);
RemoveImagesCommand = new RelayCommand(RemoveImagesMethod);
ShowImageCommand = new RelayCommand(ShowImageMethod);
SelectedImageCommand = new RelayCommand(SelectedImageMethod);
}
public ICommand AddImagesCommand { get; set; }
public ICommand ShowImageCommand { get; set; }
public ICommand RemoveImagesCommand { get; set; }
public ICommand SelectedImageCommand { get; set; }
public ObservableCollection<Image> ImageList
{
get
{
return imageList;
}
}
public Image SelectedImage
{
get
{
return selectedImage;
}
set
{
selectedImage = value;
}
}
public void SelectedImageMethod()
{
Image selected = SelectedImage;
RaisePropertyChanged("SelectedImage");
}
public void AddImagesMethod()
{
...
blablabla
....
imageList.Add(new Image
{
Name = _name,
SafeName = safeImageName,
Weight = sLen,
CheckboxDefault = false
}) ;
this.RaisePropertyChanged(() => this.ImageList);
}
public void RemoveImagesMethod()
{
imageList.Remove(SelectedImage);
RaisePropertyChanged("RemoveImagesCommand");
}
public void ShowImageMethod()
{
//string V = @"pack://application:,,,/inred;component/Sources/test.jpg";
//string V = @"pack://application:,,,/inred;component/Sources/" + SelectedImage.SafeName;
ImageWindow win2 = new ImageWindow(SelectedImage.Name);
win2.Show();
RaisePropertyChanged("ShowImageCommand");
}
您确定在单击按钮时选择了一个项目吗?此外,由于将
命令参数
绑定到列表视图
中的当前图像
,因此应在命令中使用此参数:
ShowImageCommand = new RelayCommand<Image>(ShowImageMethod);
...
public void ShowImageMethod(Image image)
{
ImageWindow win2 = new ImageWindow(image.Name);
win2.Show();
}
ShowImageCommand=新的RelayCommand(ShowImageMethod);
...
公共void ShowImageMethod(图像)
{
ImageWindow win2=新的ImageWindow(image.Name);
win2.Show();
}
单击按钮时,是否确定已选择某个项目?此外,由于将命令参数
绑定到列表视图
中的当前图像
,因此应在命令中使用此参数:
ShowImageCommand = new RelayCommand<Image>(ShowImageMethod);
...
public void ShowImageMethod(Image image)
{
ImageWindow win2 = new ImageWindow(image.Name);
win2.Show();
}
ShowImageCommand=新的RelayCommand(ShowImageMethod);
...
公共void ShowImageMethod(图像)
{
ImageWindow win2=新的ImageWindow(image.Name);
win2.Show();
}
另外,为什么需要调用RaisePropertyChanged
来获取命令?并且,在添加图像后调用this.RaisePropertyChanged(()=>this.ImageList)
对所选图像属性也没有意义。使用SelectedImageMethod毫无意义。只需将ListView的SelectedItem属性绑定到视图模型的SelectedImage属性,并在SelectedImage setter中触发PropertyChanged事件。问题的解决方案是将SelectedItem绑定到具有更改通知的属性。这不是关于优化,而是关于如何进行优化。但您没有尝试调试代码以找出imagePath为空的原因?如果SelectedItem
不为null,但是SelectedImage.Name
为null,那么您肯定添加了一个带有nullName
的图像。另外,为什么需要调用RaisePropertyChanged
来执行命令?并且,在添加图像后调用this.RaisePropertyChanged(()=>this.ImageList)
对所选图像属性也没有意义。使用SelectedImageMethod毫无意义。只需将ListView的SelectedItem属性绑定到视图模型的SelectedImage属性,并在SelectedImage setter中触发PropertyChanged事件。问题的解决方案是将SelectedItem绑定到具有更改通知的属性。这不是关于优化,而是关于如何进行优化。但您没有尝试调试代码以找出imagePath为空的原因?如果SelectedItem
不是空的,但是SelectedImage.Name
是空的,那么您肯定添加了一个带有空Name
的图像。非常感谢,这正是我需要的,您是否可以给我发送一些链接,说明RelayCommand(showmagemethod)
和RelayCommand(showmagemethod)之间的区别
有什么解释吗?因为我仍然不明白为什么我的RemoveImageMethod
可以工作,什么时候我应该使用指向对象类型的方法,什么时候我不需要指定它。有一个通用的RelayCommand
类接受类型为t
的参数。您可以通过在XAML中执行CommandParameter=“{Binding}”
来将值传递给Action
。请注意,我还有最后一个问题,如果我想要像ShowImageMethod
这样的方法,但不是
,而是想传递两个参数(比如Image
和Sound
),不幸的是,没有包含2个参数的``RelayCommand``构造函数。我在C语言是新的,但是我想的解决方案来自C++——我是指模板,我猜也可以在C语言中实现,其中参数<代码> t>代码>将是一个由2个字段组成的新类:代码>声音< /代码>和<代码>图像< /代码>和SET/GET,但也许有一种更自然、更聪明的方法可以做到这一点?@Lukashou AGH:如果你有其他问题,请问一个新问题。不要在“评论”字段中询问其他问题。如果你在这里发布新问题的链接,我会尽力帮助你。无论如何,谢谢你,这是问题的链接:非常感谢,这正是我所需要的,你可以给我发送一些链接,说明RelayCommand(showmagemethod)
和RelayCommand(showmagemethod)
之间的区别吗?因为我仍然不明白为什么我的RemoveImageMethod
可以工作,什么时候我应该使用指向对象类型的方法,什么时候我不需要指定它。有一个通用的RelayCommand
类接受类型为t
的参数。您可以通过在XAML中执行CommandParameter=“{Binding}”
来将值传递给Action
。请注意,我还有最后一个问题,如果我想要像ShowImageMethod
这样的方法,但不是
,而是想传递两个参数(比如Image
和Sound
),不幸的是,没有包含2个参数的``RelayCommand``构造函数。我在C语言是新的,但是我想的解决方案来自C++——我是指模板,我猜也可以在C语言中实现,其中参数<代码> t>代码>将是一个由2个字段组成的新类:代码>声音< /代码>和<代码>图像< /代码>和SET/GET,但也许有一种更自然、更聪明的方法可以做到这一点?@Lukashou AGH:如果你有其他问题,请问一个新问题。不要在“评论”字段中询问其他问题。如果你在这里发布新问题的链接,我会尽力帮助你。无论如何,谢谢你,这里是问题的链接:
ShowImageCommand = new RelayCommand<Image>(ShowImageMethod);
...
public void ShowImageMethod(Image image)
{
ImageWindow win2 = new ImageWindow(image.Name);
win2.Show();
}