原始更改时,viewmodel中的分配值未更新

时间:2016-12-10 12:52:20

标签: c# wpf string datetime mvvm

我有一个带有viewmodel的主窗口,其中包含属性:

class MainWindowModel : INotifyPropertyChanged
{

    ObservableCollection<Currency> currencyCollection;
    string lastUpdated;
    int updateInterval;
    public CurrencyDataSource DataSource { get; set; }


    public ObservableCollection<Currency> CurrencyCollection
    {
        get
        {
            if (currencyCollection == null)
                currencyCollection = new ObservableCollection<Currency>();
            return currencyCollection;
        }

        set
        {
            currencyCollection = value;
            OnPropertyChanged();
        }
    }

    public string LastUpdated
    {
        get
        {
            return lastUpdated;
        }

        set
        {
            lastUpdated = value;
            OnPropertyChanged();
        }
    }

    public int UpdateInterval
    {
        get
        {
            return updateInterval;
        }

        set
        {
            updateInterval = value;
        }
    }



    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName="")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        if (propertyName == "LastUpdated")
        {
            System.Diagnostics.Debug.WriteLine("Property changed from main " + propertyName + " " + this.LastUpdated); 
        }
    }
}

现在,我对这个VM的所有数据绑定在WPF接口数据绑定中都非常有效。我还有从main打开的辅助窗口,它们具有以下VM:

public class CurrencyTrackModel : INotifyPropertyChanged
{
    Currency currency;
    string lastUpdated;

    public Currency Currency
    {
        get
        {
            return currency;
        }

        set
        {
            currency = value;
        }
    }

    public string LastUpdated
    {
        get
        {
            return lastUpdated;
        }

        set
        {
            lastUpdated = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        System.Diagnostics.Debug.WriteLine("Property changed from track " + propertyName + " " + this.LastUpdated);
    }
}

我从第一个初始化辅助窗口,如下所示(我在构造函数中分配datacontext):

        Currency currency = (sender as Button).DataContext as Currency;
        CurrencyTrackModel trackModel = new CurrencyTrackModel();
        trackModel.Currency = currency;
        trackModel.LastUpdated = model.LastUpdated;
        currencyTrack trackWindow = new currencyTrack(trackModel);
        trackWindow.Show();

Currency类的属性更新时(在主窗口代码隐藏中),主窗口和辅助窗口中的UI绑定都会完美更新。但是,属性LastUpdated仅在主窗口的UI中更新。经过进一步调查,我发现trackModel.LastUpdated没有遵循mainWindow.LastUpdated;它固定在分配的第一个值上(与Currency的属性不同)。

我尝试使用DateTime代替string,但它也没有用。我不知道如何在互联网上搜索它;引用和其他搜索通常会导致函数传递页面。

货币类(只有字段,道具是标准的):

    private decimal sellValue;
    private decimal buyValue;
    private decimal prevSellValue;
    private decimal prevBuyValue;
    private string sellValueColor;
    private string buyValueColor;
    private string sellArrow;
    private string buyArrow;

主窗口绑定:

                <TextBlock Text="{Binding Path=LastUpdated,StringFormat=last Updated: {0:F}}"></TextBlock>

辅助窗口绑定:

<TextBlock Text="{Binding Path=LastUpdated, StringFormat=f}"></TextBlock>

1 个答案:

答案 0 :(得分:1)

  

但是,属性LastUpdated仅在主窗口的UI中更新。

这是因为第二个窗口绑定到与MainWindow完全不同的源属性,更新MainWindowModel类的source属性不会自动更新CurrencyTrackModel的source属性。

DateTime是一个值类型,因此以下代码行只是创建DateTime值的副本并将其分配给CurrencyTrackModel的LastUpdated属性:

trackModel.LastUpdated = model.LastUpdated;

在此之后,MainViewModel的LastUpdated属性与CurrencyTrackModel的LastUpdate属性之间没有任何形式的连接。内存中将有两个不同的DateTime对象,其中一个属性不会影响另一个。

只要您希望更新第二个窗口中的TextBlock,就必须设置CurrencyTrackModel的LastUpdated属性。或者,您可以为两个窗口使用相同的视图模型,并将两个TextBlocks绑定到完全相同的源属性。