C# 原始更改时,viewmodel中的指定值未更新

C# 原始更改时,viewmodel中的指定值未更新,c#,wpf,string,datetime,mvvm,C#,Wpf,String,Datetime,Mvvm,我有一个带有viewmodel的主窗口,其中包含以下属性: class MainWindowModel : INotifyPropertyChanged { ObservableCollection<Currency> currencyCollection; string lastUpdated; int updateInterval; public CurrencyDataSource DataSource { get; set; }

我有一个带有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); 
        }
    }
}
我从第一个开始初始化辅助窗口,如下所示(我在构造函数中分配datacontext):

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

我尝试使用
DateTime
而不是
string
,但效果并不理想。我几乎不知道如何在网上搜索它;引用和其他搜索通常会导致函数传递页面

货币类别(仅字段、道具为标准):

主窗口绑定:

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

辅助窗口绑定:

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

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

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

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

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


每当需要更新第二个窗口中的TextBlock时,必须设置CurrencyTrackModel的LastUpdate属性。或者,您可以对两个窗口使用相同的视图模型,并将两个文本块绑定到非常相同的源属性。

我认为问题在于窗口中没有调用重新绘制。在许多情况下,我看到DGV数据源是一个datatable,该表得到更新,但DGV没有更新。解决这个问题的诀窍是将DataSource设置为null,然后设置为datatable;第二个属性下的数据绑定值未与第一个属性同步。即,当我说
trackModel.LastUpdated=model.LastUpdated时
、trackmodel和model具有不同的对象,但应该是它们指向同一个对象。此外,WPF接口通常专门用于数据绑定,因此它们在重新绘制时不会出现问题。实际上,首先我使用了
DateTime
,然后我意识到它是一种值类型,所以我将
LastUpdated
属性转换为
string
,认为字符串是引用类型。通过这种方式,我认为main和currency窗口数据源将指向同一个对象,但显然它们不是。不,它们不是,因为字符串也是不可变的,所以它的工作方式与DateTime相同。的确,System.String确实是一种引用类型,但它的行为仍然是一种值类型:这很有意义。谢谢
trackModel.LastUpdated = model.LastUpdated;