2

何かをテストしたかったので、ボタンとリストボックスを備えた小さなビューとビューモデルを作成しました。ボタンをクリックすると、以下のコードのように RunCommand を実行します。Dispatcher が実行したいアクションを起動しない理由がわかりません。

ビューモデルのコードは次のとおりです。

public class ViewModel
{
    private ObservableCollection<string> _items = new ObservableCollection<string>();
    private ICommand _runCommand;

    public ICommand RunCommand { get { return _runCommand ?? (_runCommand = new ActionCommand(RunCommandAction)); } }

    private void RunCommandAction()
    {
        Task.Factory.StartNew(() =>
        {
            if (Thread.CurrentThread == EnvironmentData.UIThread)
                _items.Add("Eldad");
            else
                Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => _items.Add("Eldad")));
        });
    }

    public IEnumerable<string> Items
    {
        get { return _items; }
    }

    public ViewModel()
    {
        _items.Add("Shahar");
    }
}

どんなアイデアも素晴らしいでしょう

ありがとう

4

1 に答える 1

2

Dispatcher.CurrentDispatcher - 現在実行中のスレッドの Dispatcher を取得し、まだスレッドに関連付けられていない場合は新しい Dispatcher を作成します。

Task.Factory.StartNew を使用したため、これを実行するスレッドはメイン スレッドではありません。UI スレッドに Dispatcher を使用する場合は、App.Current.Dispatcher を使用する必要があります。

于 2013-06-11T10:22:36.273 に答える