Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示ListView中选定图像的新窗口不';我没有访问映像路径的权限_C#_Wpf_Image_Listview_Mvvm - Fatal编程技术网

C# 显示ListView中选定图像的新窗口不';我没有访问映像路径的权限

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

我有一个带有ListView的应用程序,我通过单击AddImage按钮将图像添加到该列表中,我还有一个从该列表中删除图像的按钮。我使用SelecteImage对象来实现这一点,一切都很好。但我希望有一个按钮来显示所选图像,我就是这样做的:

        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,那么您肯定添加了一个带有null
Name
的图像。另外,为什么需要调用
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();
}