[英]DataBinding to Property of a property of a singleton
我希望將我的xaml中的文本字段綁定到屬性PlayerData.Instance.data.MyXP
,類結構是這樣的
class PlayerData
{
public static PlayerData Instance = new PlayerData();
public UserData data {get;set;}
}
class UserData
{
public int MyXP {get;set;}
}
有人可以解釋(如果有的話)我可以做到這一點。 我從SO的問題中嘗試了多種方法,但沒有找到成功的方法。 我最大的問題是在創建UI后分配了PlayerData.Instance.data,因此我可能需要UserData上的某種notify事件,但也需要MyXP上的某種通知事件,因為我希望在xp更改時更新UI。
通常,當您使用單例時,使用它的每個對象都將獲得Instance屬性的副本。 您可以在保存該引用的View Model對象上創建一個屬性,然后將其綁定到該屬性。 例如:
public class MyViewModel : ViewModelBase {
public PlayerData PlayerData {
get { return iPlayerData; }
set {
iPlayerData = value;
OnPropertyChanged( "PlayerData" );
}
}
private PlayerData iPlayerData;
// Other properties & code
}
然后,在您的XAML中,假設您已經將Window
對象的DataContext
屬性綁定到了View Model對象,則可以使用如下代碼:
<TextBlock Text="{Binding Path=PlayerData.data.MyXP}" />
您可能還需要指定一個實現IValueConverter
接口的對象,以正確格式化int MyXP屬性。
(請注意,如果您具有多線程環境,則如圖所示,代碼不是有效的單例模式實現。請參閱本文,並查看標題為“在C#中實現單例模式的第四種方法:多線程單例模式”的部分。如果您的代碼是多線程的)。
您需要實現INotifyPropertyChanged
並將TextBlock
DataContext
設置為您的實例:
class PlayerData
{
public static PlayerData Instance = new PlayerData();
private UserData data = new UserData();
public UserData Data
{
get { return data; }
set { data = value; }
}
}
class UserData : INotifyPropertyChanged
{
private int myXP = 0;
public int MyXP
{
get { return myXP; }
set
{
myXP = value;
RaiseProperty("MyXP");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaiseProperty(string property = null)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
在XAML中,您可以這樣操作:
<TextBlock Name="myExp" Text="{Binding Data.MyXP}" Grid.Row="2"/>
為了使其正常工作,您需要將TextBlock
的DataContext
設置為您的實例:
myExp.DataContext = PlayerData.Instance;
然后,您可以自由選擇XP,並且應該在UI上看到它:
PlayerData.Instance.Data.MyXP = 1000;
您還可以將PlayerData : INotifyPropertyChanged
為綁定其他數據。 希望本示例將向您展示其工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.