簡體   English   中英

單例屬性的數據綁定到屬性

[英]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"/>

為了使其正常工作,您需要將TextBlockDataContext設置為您的實例:

myExp.DataContext = PlayerData.Instance;

然后,您可以自由選擇XP,並且應該在UI上看到它:

PlayerData.Instance.Data.MyXP = 1000;

您還可以將PlayerData : INotifyPropertyChanged為綁定其他數據。 希望本示例將向您展示其工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM