C# 通过单击按钮使用视图模型更新Listview

C# 通过单击按钮使用视图模型更新Listview,c#,wpf,listview,mvvm,viewmodel,C#,Wpf,Listview,Mvvm,Viewmodel,我希望能够在用户单击listview项(行)并单击按钮时更新listview。这是我的密码: XAML 如果用户单击列表视图中的某一行并单击“加载到扫描仪”按钮,是否有人可以告诉我如何更新其中一个listview行并使进度条可见?欢迎使用示例按钮单击代码。试试这个 1-在VM中创建一个列表来保存所选项目,例如ObservableCollection SelectedScanners{get;set;} 2-在xaml中,将ListView的SelectedItem绑定到上面的 3-为按钮创建IC

我希望能够在用户单击listview项(行)并单击按钮时更新listview。这是我的密码:

XAML

如果用户单击列表视图中的某一行并单击“加载到扫描仪”按钮,是否有人可以告诉我如何更新其中一个listview行并使进度条可见?欢迎使用示例按钮单击代码。

试试这个

1-在VM中创建一个列表来保存所选项目,例如ObservableCollection SelectedScanners{get;set;} 2-在xaml中,将ListView的SelectedItem绑定到上面的 3-为按钮创建ICommand

public ICommand UpdateScannersCommand
{
    get
    {
       return new RelayCommand(()=>
{
... update code here
}
}
}
4-删除VISIBILITY属性,改为使用布尔值(并在xaml中使用转换器来确定可见性)


5

如果要更新,需要实施InotifyProperty更改ICommand不起作用。我有按钮命令={Binding UpdateScannersCommand}。当我点击时,什么也没发生。我已将更新代码放在您指示的位置。
public class ScannerViewModel : INotifyPropertyChanged
{

    private String[] scanners;

    ObservableCollection<Scanner> items = new ObservableCollection<Scanner>();
    private ArrayList driveList = new ArrayList();
    public ScannerViewModel()
    {
        GetDrives();
        scanners = (String[])driveList.ToArray(typeof(String));

        if (scanners.Length <= 0)
        {
            return;
        }
        else
        {
            foreach (String scnr in scanners)
            {
                Config c = new Config();
                c.LoadSysInfo(scnr + "\\Parameters\\SYSINFO.TXT");

                ProgressBar progBar = new ProgressBar();
                progBar.Height = 20;
                progBar.Width = 150;

                items.Add(new Scanner() { Drive = scnr, Model = c.Model, Serial = c.Serial, maxProgress = 10000, progress = 0, isVisible= Visibility.Hidden });
            }
        }
    }
    private void GetDrives()
    {
        driveList.Clear();
        foreach (DriveInfo info in DriveInfo.GetDrives())
        {
            if (info.DriveType == DriveType.Removable)
            {

                if (Directory.Exists(info.RootDirectory.ToString() + "Parameters"))
                {

                    driveList.Add(info.RootDirectory.ToString());
                }
            }
        }
    }

    public ObservableCollection<Scanner> Scanners
    {

        get
        {
            return items;
        }
        set
        {
            items = value;
            RaisePropertyChanged("Scanners");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
  }
}
public class Scanner
{
    public String Model { get; set; }
    public String Serial { get; set; }
    public Visibility isVisible { get; set; }
    public String Drive { get; set; }
    public Int32 progress { get; set; }
    public Int32 maxProgress { get; set; }
 }
}
public ICommand UpdateScannersCommand
{
    get
    {
       return new RelayCommand(()=>
{
... update code here
}
}
}