在xaml中使用backgroundworker和绑定时,UI不会更新

时间:2014-09-30 12:54:14

标签: c# wpf xaml mvvm backgroundworker

我目前正在尝试通过backgroundworker类更新我的UI中的文本框。这个后台工作者在我的解决方案的ViewModel部分中,它只在我的应用程序接收数据时发生(在我的模型上作为事件触发)。

我在我的MainWindow xaml文件中使用了绑定来将文本绑定到我的ViewModel中的属性,并且当设置了断点时,它似乎存储了正确的值,即使它们仍未显示。

我不太确定DoWork事件和事件之间的分歧。 RunWorkerCompleted事件。我有DoWork事件将数据包设置为收到的最新数据包,并在完成时(RunWorkerCompleted),我将值分配给在ViewModel中创建的属性。我是否正确实现了backgroundworker类?

对此有任何帮助将非常感激。

视图

<TextBox Height="23" HorizontalAlignment="Left" Margin="577,70,0,0" Name="receiveVariableValueBox" VerticalAlignment="Top" Width="120" Text="{Binding Path=RxVariableValue}"/>

视图模型

public class DataPointsViewModel : INotifyPropertyChanged
{
    public Model model;

    BackgroundWorker receiveBackground;
    RRTDataPacket rxDataPacket = new RRTDataPacket();

    private int rxVariableValue;
    public int RxVariableValue
    {
        get { return rxVariableValue; }
        set
        {
            if(rxVariableValue != value)
            {
                rxVariableValue = value;
                OnPropertyChanged(rxMajorVersion.ToString());
            }
        }
    }

    public void receivingUpdater(object sender, EventArgs e)
    {
        receiveBackground = new BackgroundWorker();
        receiveBackground.DoWork += new DoWorkEventHandler(receiveBackground_DoWork);            
        receiveBackground.RunWorkerCompleted += new RunWorkerCompletedEventHandler(receiveBackground_RunWorkerCompleted);
        receiveBackground.RunWorkerAsync();
    }

    public void receiveBackground_DoWork(object sender, DoWorkEventArgs e)
    {  
        try
        {
            if (rxDataPacket != Engine.latestRxDataPacket)
            {
                rxDataPacket = Engine.latestRxDataPacket;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }           
    }

    public void receiveBackground_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if(rxDataPacket != null)
        {
            RxMajorVersion = (int)rxDataPacket.majorVersion;
            RxVariableValue = (int)rxDataPacket.variableValue;
        }
    }

2 个答案:

答案 0 :(得分:1)

您的OnPropertyChanged错误

public int RxVariableValue
{
    get { return rxVariableValue; }
    set
    {
        if(rxVariableValue != value)
        {
            rxVariableValue = value;
            OnPropertyChanged("RxVariableValue");
        }
    }
}

答案 1 :(得分:0)

尝试调用OnPropertyChanged(&#34; RxVariableValue&#34;);在RxVariableValue的setter中