【问题标题】:How do I access a variable from another class to update my ViewModel如何从另一个类访问变量以更新我的 ViewModel
【发布时间】:2019-08-05 01:24:11
【问题描述】:

我有一个上面有ProgrressBar 的应用程序。 我还有一个充当DownloadService 的类,因为它在多个 ViewModel 中使用。

如您所见,DownloadData 函数模拟它下载内容并以百分比跟踪已下载的数据总量,它从 0 到 100。

如何使我的ProgressBar 获得与totalDownloaded 相同的值,而不将 MainWindowViewModel 作为参数传递。

主窗口

<Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <StackPanel>
        <ProgressBar Height="25"
                     Maximum="100"
                     Value="{Binding ProgressValue}"/>
        <Button HorizontalAlignment="Center"
                Width="100" Height="25"
                Content="Start"
                Command="{Binding StartDownloadCommand}"/>
    </StackPanel>

MainWindowViewModel

class MainWindowViewModel : ObservableObject
    {
        private int _progressValue;

        public int ProgressValue
        {
            get { return _progressValue; }
            set
            {
                _progressValue = value;
                OnPropertyChanged();
            }
        }

        DownloadService ds = new DownloadService();

        public RelayCommand StartDownloadCommand { get; set; }

        public MainWindowViewModel()
        {
            StartDownloadCommand = new RelayCommand(o => { ds.DownloadData(); }, o => true);
        }
    }

还有 DownloadService

 class DownloadService
    {
        public void DownloadData()
        {
            int totalDownloaded = 0;

            for (int i = 0; i < 101; i++)
            {
                totalDownloaded++;
                Console.WriteLine(totalDownloaded);
            }
        }
    }

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

    参考Progress&lt;T&gt; Class

    提供一个IProgress&lt;T&gt;,为每个报告的进度值调用回调。

    重构服务以依赖IProgress&lt;int&gt;抽象并使用它来报告进度

    class DownloadService {
        public void DownloadData(IProgress<int> progress = null) {            
            int totalDownloaded = 0;
            for (int i = 0; i < 101; i++) {
                totalDownloaded++;
                progress?.Report(totalDownloaded); // ?. just in case
                Console.WriteLine(totalDownloaded);
            }
        }
    }
    

    视图模型可以将Progress&lt;int&gt; 传递给服务以获取进度更新报告。

    public MainWindowViewModel() {
        StartDownloadCommand = new RelayCommand(o => { 
            var progress = new Progress<int>(value => ProgressValue = value);
            ds.DownloadData(progress); 
        }, o => true);
    }
    

    显式依赖IProgress&lt;int&gt; 避免了将视图模型与服务紧密耦合。

    【讨论】:

    • 太棒了我不知道这是一件事,我知道一定有类似的东西但是哇..谢谢!我喜欢学习新的很酷的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多