【发布时间】:2015-03-02 13:14:52
【问题描述】:
在我解释问题之前,用一句话总结我曲折的问题。我怎样才能做到这一点,如果我从字典中的键更新值,它将触发与该键/TextBinding 关联的 OnPropertyChanged 方法,或者我应该以不同的方式执行此操作
我在 WPF/MVVM 数据绑定方面有一些经验,因此理想的解决方案适用于我的项目:如果我的游戏中的某个值发生更改,它将自动更新它当前显示在 UI 上的任何位置。
我有一个非常基本的地方可以开始使用字典查找表,但可能有些人明白我需要什么,这样会更好地工作
第一个代码块是BindingBehavior,可以看作是附加到UI文本字段(更精确一点是同一父游戏对象的组件)
如果我将 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());
【问题讨论】:
标签: c# dictionary unity3d