DataBinding to singleton属性的Property

时间:2014-02-20 15:43:10

标签: c# xaml data-binding windows-phone-8

我希望我的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。

2 个答案:

答案 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; 。希望这个例子能告诉你它是如何工作的。