首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM数据更新

MVVM数据更新
EN

Stack Overflow用户
提问于 2012-08-09 20:56:33
回答 1查看 528关注 0票数 0

我最近下载了MahApps.Metro包来尝试一下Metro Design和MVVM。

在那里的项目中,他们创建了ViewModel:

代码语言:javascript
复制
DataContext = new MainWindowViewModel(Dispatcher);

它看起来像这样:

代码语言:javascript
复制
public class MainWindowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private readonly Dispatcher _dispatcher;

    public bool Busy { get; set; }

    public MainWindowViewModel(Dispatcher dispatcher)
    {
        Busy = true;
        _dispatcher = dispatcher;

        var wc2 = new WebClient();
        wc2.DownloadStringCompleted += WcDownloadStringCompleted2;
        wc2.DownloadStringAsync(new Uri("http://ws.audioscrobbler.com/2.0/?method=chart.gethypedtracks&api_key=b25b959554ed76058ac220b7b2e0a026&format=json"));
    }

    private void WcDownloadStringCompleted2(object sender, DownloadStringCompletedEventArgs e)
    {
        try
        {
            var x = JsonConvert.DeserializeObject<TrackWrapper>(e.Result);
            _dispatcher.BeginInvoke(new Action(() =>
                                                   {
                                                       Busy = false;
                                                   }));

        }
        catch (Exception ex)
        {

        }
    }
}

我删掉了几个部分,但代码的工作方式如下所示。因此,他们基本上创建了一个线程,在线程结束之前,他们将Busy-Property设置为false (没有触发任何事件)。

在XAML中,他们将此属性绑定到忙指示器:

代码语言:javascript
复制
<Controls:ProgressRing IsActive="{Binding Busy}" VerticalAlignment="Center" HorizontalAlignment="Center" />

一切都很正常,控件会随着属性的变化而改变。

但现在我想从一开始就复制它。XAML和设置DataContext是一样的。我的ViewModel看起来像这样(这次是VB,但应该不会有什么不同):

代码语言:javascript
复制
Public Class testmodel
Implements INotifyPropertyChanged

Private _busy As Boolean = True
Public Sub New(dispatcher As Windows.Threading.Dispatcher)
    Dim t1 As Thread = New Thread(Sub()
                                      'Emulate Progress
                                      System.Threading.Thread.Sleep(2000)
                                      dispatcher.BeginInvoke(New Action(Sub()
                                                                            Busy = False
                                                                        End Sub))

                                  End Sub)
    t1.Start()
End Sub

Public Property Busy As Boolean
    Get
        Return _busy
    End Get
    Set(value As Boolean)
        NotifyPropertyChanged(Nothing)
        _busy = value
    End Set
End Property

Protected Sub NotifyPropertyChanged(info As [String])
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub

Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

结束类

因此,我创建了一个新线程,将其停止2秒,然后更改Busy-属性。首先,我没有触发事件(与原始事件一样),但没有发生任何事情。然后我添加了这行代码来触发事件,但是没有再次发生任何事情。

我在监督什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-09 21:02:54

我认为这是因为您在设置值之前通知您的属性更改。此外,您的属性更改不会发送任何内容。如果不将名称作为参数发送,则无法指示更新了哪个属性。

代码语言:javascript
复制
Public Property Busy As Boolean
    Get
        Return _busy
    End Get
    Set(value As Boolean)            
        _busy = value
        NotifyPropertyChanged("Busy")
    End Set
End Property
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11883962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档