我希望我的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上使用某种通知事件,但也需要在MyXP上,因为我希望在xp更改时更新UI。
答案 0 :(得分:4)
通常,当您使用单例时,使用它的每个对象都会获得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属性。
(请注意,如果您有多线程环境,则您的代码(如图所示)不是单例模式的有效实现。请参阅this article并查看部分标题“实现Singleton模式的第四种方式C#:多线程单例模式“如果您的代码是多线程的。”
答案 1 :(得分:1)
您需要实施INotifyPropertyChanged
并将DataContext
的{{1}}设置为您的实例:
TextBlock
在XAML中你可以这样做:
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));
}
}
要使其有效,您需要将<TextBlock Name="myExp" Text="{Binding Data.MyXP}" Grid.Row="2"/>
的{{1}}设置为您的实例:
DataContext
然后你可以自由地改变你的XP,你应该把它看作UI:
TextBlock
如果您在某处绑定了其他数据,也可以创建myExp.DataContext = PlayerData.Instance;
。希望这个例子能告诉你它是如何工作的。