Значение привязки данных не обновляется из другого потока - PullRequest
5 голосов
/ 13 марта 2012

У меня есть приложение WPF, в котором у меня есть следующее свойство StepCount в моей ViewModel, которое реализует INotifyPropertyChanged, а затем оно привязано к TextBox в моем представлении.

public int StepCount
{
   get { return _stepCount; } 
   set
   {
      _stepCount = value;
      OnPropertyChanged("StepCount");
   }
}

В XAML здесьВот как выглядит DataBinding:

<TextBox Text="{Binding Path=StepCount}" />

Это прекрасно работает, и если я изменяю значение StepCount, значение Textbox обновляется соответствующим образом.

Однако моя проблема в том, что у меня есть другой потокэто увеличивает StepCount, и в этом случае значение TextBox не обновляется.Как только поток заканчивается, значение Textbox обновляется до правильного значения.

Мне нужно, чтобы значение Textbox обновлялось каждый раз, когда мой другой поток увеличивает StepCount.Как и сейчас, значение Textbox показывает обновление только после завершения потока.

Другой поток увеличивает StepCount, но изменение не отображается в пользовательском интерфейсе, пока поток не завершится.

Есть идеи?

ОБНОВЛЕНИЕ

Я ценю все ответы.Эта проблема вызывает недоумение, поскольку ранее работавший код, похоже, перестал работать, как и в случае с этими конкретными привязками.

Когда я устанавливал VS 2011 Beta, он устанавливал .NET 4.5 Beta Framework, а когда я удалялБета-версия VS 2011, подозреваемая в том, что она может вызывать проблемы, не удалила .NET 4.5 Beta Framework.

Я только что удалила .NET 4.5 Framework и выполнила ремонтную установку .NET 4.0 Framework.,После выполнения этих шагов мои привязки данных работали правильно, и теперь Textbox корректно обновляется всякий раз, когда другой поток увеличивает StepCount.

Итак, похоже, что .NET 4.5 Beta Framework может вызывать проблемы с привязками данных.

Я сообщу об этом в Microsoft.

Спасибо всем за ваши ответы.

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Как только вы обнаружили, что классы WPF, с которыми вы связали свой View в модели View, работают в потоке пользовательского интерфейса.

В идеале вы должны изменить свойство StepCount вашей модели представления, используя диспетчер WPF и команду Invoke. Это приведет к соответствующему вызову.

См. эту статью для получения дополнительной информации об этом процессе.

0 голосов
/ 13 марта 2012

Протестировано только сейчас, и все работает нормально

public partial class MainWindow : Window
{
    SimpleClass simpleClass = new SimpleClass(10);
    public MainWindow()
    {
        InitializeComponent();
        DataContext = simpleClass;
    }

    void IncrementViewModelProperty()
    {            
        simpleClass.StepCount += 11;
        Thread.Sleep(5000);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //works the same
        //Thread thread = new Thread(() => IncrementViewModelProperty());
        //thread.Start();
        Action act = IncrementViewModelProperty;
        act.BeginInvoke(null, null);
    }
}

public class SimpleClass : INotifyPropertyChanged
{
    public SimpleClass(int stepCnt)
    {
        StepCount = stepCnt;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public int StepCount
    {
        get { return _stepCount; }
        set
        {
            _stepCount = value;
            NotifyPropertyChanged("StepCount");
        }
    }
    private int _stepCount;
}

затем в xaml:

<StackPanel>
    <TextBlock Text="{Binding Path=StepCount, Mode=OneWay}" />
    <Button Content="Increment value in separate thread" Click="Button_Click" />
</StackPanel>

НО! если вы нажмете кнопку быстро и часто, вы исчерпали пул потоков, и это действительно не обновит свойство должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...