【问题标题】:Using progress bar to upload a file in WPF C# MVVM使用进度条在 WPF C# MVVM 中上传文件
【发布时间】:2020-10-09 12:12:09
【问题描述】:

我想显示上传文件的进度条

xaml

  <ProgressBar HorizontalAlignment="Left" Height="30" Margin="145,6,0,0" VerticalAlignment="Top" Width="469"   Value="{Binding progressBar1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"   Grid.Row="1" />

这是我的进度控制

model.cs

public string progressBar1
        {
            get
            {
                return _ProgressBar;
            }
            set
            {
                _ProgressBar = value;
                OnPropertyChanged("progressBar1");
            }
        }

视图模型

  private Files _FileDetails;

        public Files FilesDetails
        {
            get
            {
                return _FileDetails;
            }
            set
            {
                _FileDetails = value;
            }
        }

//some code 

 void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            FilesDetails.progressBar1.Value = e.ProgressPercentage;

            if ((progressBar1.Value / 2) == 0)
            {
                lblStatus.Content = "Downloading.";
            }
            else if ((progressBar1.Value / 3) == 0)
            {
                lblStatus.Content = "Downloading..";
            }
            else if ((progressBar1.Value / 5) == 0)
            {
                lblStatus.Content = "Downloading...";
            }

            lblStatus.Content = "Download " + filesizedownloaded.ToString("F2") + " / " + filesize.ToString("F2")
                + " ( " + progressBar1.Value.ToString() + " ) % Complete.";
        }

在worker_ProgressChanged 函数中,我无法访问progressBar1 的值。在“value”下显示错误

string' 不包含 'Value' 的定义并且不可访问 扩展方法“值”接受“字符串”类型的第一个参数 可以找到(您是否缺少 using 指令或程序集 参考?)

悬停值时显示上述错误

【问题讨论】:

  • 您正在使用progressBar1.Value 从模型访问您的progressBar1,它是一个字符串并且没有对值的引用。你的意思可能是FilesDetails.progressBar1.Value
  • FilesDetails.progressBar1.Value = e.ProgressPercentage;我已经尝试过这个并为“值”显示错误。错误信息已添加到我的问题中
  • 所有progressBar1.Value都显示错误。值下的错误指示器
  • 我认为当我写“FilesDetails.progressBar1”时它认为它是一个字符串。所以我不能在那里使用值。但我想分配一个值以便我必须显示百分比
  • 清除 "public int progressBar1=0;"在顶部..但显示“运算符'/'不能应用于'string'和'int'类型的操作数”

标签: c# wpf mvvm progress-bar


【解决方案1】:

当你使用一个数值变量时,你在引用它时不要在末尾加上一个 .Value。

您的 ,UpdateSourceTrigger=PropertyChanged 在该绑定中是不合适的。去掉它。 无论如何,让 Progressbar ValueProperty 以一种方式绑定也没有意义,所以让你的绑定更简单:

Value="{Binding progressBar1}"

然后看看你的代码。

想想它在做什么。

该属性可以是 double 或 int,但让我们使用 int。所以支持者也需要改变。

    private int _ProgressBar = 0;
    public int progressBar1
    {
        get =>_ProgressBar;
        set
        {
            _ProgressBar = value;
            OnPropertyChanged("progressBar1");
        }
    }

删除所有这些 .Value 给出:

void worker_ProgressChanged(对象发送者,ProgressChangedEventArgs e) { progressBar1 = e.ProgressPercentage;

        if ((progressBar1 / 2) == 0)
        {
            lblStatus.Content = "Downloading.";
        }
        else if ((progressBar1 / 3) == 0)
        {
            lblStatus.Content = "Downloading..";
        }
        else if ((progressBar1 / 5) == 0)
        {
            lblStatus.Content = "Downloading...";
        }

        lblStatus.Content = $"Download {progressBar1} % Complete.";
    }

我没有看到文件大小的定义,所以我删除了它。 目前尚不清楚worker_ProgressChanged 处理程序在哪里,因此progressBar1 属性与它的关系在哪里。我猜上面的代码在同一个类中。

注意事项:

如果您告诉我们您有错误。

告诉我们哪一行,并确保问题中的代码与您正在使用的代码相匹配。

阅读命名约定。

大多数团队使用大写字母开头

private 开始小写

下划线前缀有相当多的变化。

【讨论】:

    【解决方案2】:

    您需要创建progressBar1integer

    public int progressBar1
    {
         .....
    }
    

    之后,您可以仅使用名称访问它的值,因为它是 integer,您也可以将其除以您分配的值。

    确保在消息的最后部分添加+= 艰难,这样我们刚刚放入字符串中的消息(例如“正在下载。”)不会立即被覆盖。

    progressBar1 = e.ProgressPercentage;
    
    if ((progressBar1 / 2) == 0) {
        lblStatus.Content = "Downloading.";
    }
    
    .....
    
    lblStatus.Content += filesizedownloaded.ToString("F2") + " / " + filesize.ToString("F2") 
        + " ( " + progressBar1.Value.ToString() + " ) % Complete.";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多