0

最近、MahApps.Metro パッケージをダウンロードして、Metro Design と MVVM をいじってみました。
そこのプロジェクトでは、ViewModel を作成します。

DataContext = new MainWindowViewModel(Dispatcher);

次のようになります。

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 では、このプロパティをビジー インジケーターにバインドします。

<Controls:ProgressRing IsActive="{Binding Busy}" VerticalAlignment="Center" HorizontalAlignment="Center" />

すべてが正常に機能しており、プロパティのようにコントロールが変化します。
しかし今、私は最初にこれをコピーしたかった. XAML と DataContext の設定は同じです。私のViewModelは次のようになります(今回はVBですが、違いはありません):

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-Property を変更します。まず、(元のイベントのように) イベントを発生させませんでしたが、何も起こりません。次に、イベントを発生させる行を追加しましたが、何も起こりません。
私は何かを監督していますか?

4

1 に答える 1

2

値を設定する前にプロパティの変更を通知しているためだと思います。また、プロパティの変更は何も送信していません。引数として名前を送信しないと、どのプロパティが更新されたかはわかりません。

Public Property Busy As Boolean
    Get
        Return _busy
    End Get
    Set(value As Boolean)            
        _busy = value
        NotifyPropertyChanged("Busy")
    End Set
End Property
于 2012-08-09T13:02:53.920 に答える