我有一个带有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>
答案 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绑定到完全相同的源属性。