在我解釋問題之前,在一個句子中總結我的曲折問題。我怎樣才能使它,如果我更新從我的詞典中的鍵的值,它會觸發與該鍵/ TextBinding關聯的OnPropertyChanged方法,或者我應該這樣做一個不同的方式數據綁定像Unity一樣的行爲
我有一些經驗WPF/MVVM數據綁定,所以夢想解決方案適用於我的項目:如果我的遊戲中的值發生更改,它會自動更新當前顯示在UI上的任何位置。
我有一個非常簡陋的地方開始使用字典查找表,但可能會有一些人誰知道我需要什麼,這將更好地工作
的一個代碼塊是BindingBehavior,可以是視爲附加到用戶界面文本字段(相同的父遊戲對象的一個組成部分要更精確一點)
如果我將TextBinding設置爲一個值,我的UI更改以反映它,但如果通過我更改了一個值字典似乎是我的字典當時只保存了分配給它的值的副本,並且不更新引用「TextBinding」
編輯:我失去了文本塊不知何故,修補
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
public class BindingBehavior : MonoBehaviour
{
public string BindingName;
public string TextInitialValue;
private string _textBinding;
public string TextBinding
{
get
{
return _textBinding;
}
set
{
_textBinding = value;
NotifyPropertyChanged(value);
}
}
void NotifyPropertyChanged (string value)
{
this.gameObject.GetComponent<Text>().text = value;
}
// Use this for initialization
void Start()
{
TextBinding = TextInitialValue;
UIManager.Instance.BindingLookUp.Add(BindingName, TextBinding);
Debug.Log (BindingName + ", " + TextBinding + " was added to Binding Lookup Dictionary");
}
}
以下是可讀性單獨的類
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
using System.Collections.Generic;
public class UIManager
{
private static UIManager _instance;
public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
set
{
_instance = value;
}
}
public Dictionary<string, string> BindingLookUp = new Dictionary<string, string>();
}
編輯:使用一個類從一些建議閱讀第二次嘗試堆棧溢出(引用類型?)的其他地方似乎仍然沒有做這項工作。
public class BindableString
{
private string _stringValue;
public string StringValue
{
get
{
return _stringValue;
}
set
{
_stringValue = value;
}
}
public BindableString(string s)
{
StringValue = s;
}
}
public class BindingBehavior : MonoBehaviour
{
public string BindingName;
public string TextInitialValue;
private BindableString _textBinding;
public BindableString TextBinding
{
get
{
return _textBinding;
}
set
{
_textBinding = value;
NotifyPropertyChanged(value);
}
}
void NotifyPropertyChanged (BindableString str)
{
this.gameObject.GetComponent<Text>().text = str.StringValue;
}
// Use this for initialization
void Start()
{
TextBinding = new BindableString(TextInitialValue);
UIManager.Instance.BindingLookUp.Add(BindingName, TextBinding);
Debug.Log (BindingName + ", " + TextBinding + " was added to Binding Lookup Dictionary");
}
}
public class UIManager
{
private static UIManager _instance;
public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
set
{
_instance = value;
}
}
public Dictionary<string, BindableString> BindingLookUp = new Dictionary<string, BindableString>();
}
這是我提出來更新文本
UIManager.Instance.BindingLookUp["ActiveCharacterActionPointsRemaining"] = new BindableString(_activeCharacter.actionPointsRemaining.ToString());
感謝我給這一個嘗試 – Oliver
我得到一個問題,下面一行的UI文本/ T/T/T/t公共類ObservableDictionary:IDictionary ,INotifyCollectionChanged,INotifyPropertyChanged/t/t/t/t它看起來像我在使用系統。ComponentModel它沒有帶來INotifyCollection改變,沒有選項來解決它,它是什麼,我需要做的就是它找到INotifyCollectionChanged –
Oliver
您需要引用'System.ObjectModel'組裝。 http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(System.Collections.Specialized.INotifyCollectionChanged);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k (DevLang-CSHARP)RD =真 –