Я пытаюсь лучше понять, как работает привязка данных в .net.Я проверял эту статью и придумал следующий код:
public partial class Form1 : Form//, INotifyPropertyChanged
{
public event PropertyChangedEventHandler MyTextChanged;
[System.ComponentModel.Bindable(true)]
public string MyText
{
get { return textBox1.Text; }
set
{
textBox1.Text = value;
if (MyTextChanged != null)
MyTextChanged(this, new PropertyChangedEventArgs("MyText"));
}
}
MyClass myClass { get; set; }
public Form1()
{
InitializeComponent();
myClass = new MyClass();
Binding binding = new Binding("MyText", myClass, "Dic");
binding.Parse += new ConvertEventHandler(binding_Parse);
binding.Format += new ConvertEventHandler(binding_Format);
DataBindings.Add(binding);
myClass.AddStuff("uno", "UNO");
}
void OnMyTextChanged(PropertyChangedEventArgs e)
{
if (MyTextChanged != null) MyTextChanged(this, e);
}
void binding_Format(object sender, ConvertEventArgs e)
{
if (e.Value is Dictionary<string, string>)
{
Dictionary<string, string> source = (Dictionary<string, string>)e.Value;
e.Value = source.Count.ToString();
}
}
void binding_Parse(object sender, ConvertEventArgs e)
{
MessageBox.Show(e.DesiredType.ToString());
}
private void changemyClassButton_Click(object sender, EventArgs e)
{
myClass.AddStuff(myClass.Dic.Count.ToString(), "'" + myClass.Dic.Count.ToString() + "'");
}
private void changeMyTextButton_Click(object sender, EventArgs e)
{
MyText = "1234";
}
}
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Dictionary<string, string> Dic { get; set; }
public MyClass()
{
Dic = new Dictionary<string, string>();
}
public void AddStuff(string key, string value)
{
Dic.Add(key, value);
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Dic"));
}
}
Я пытаюсь связать MyText
с myClass
.Проблема в том, что функция binding_Parse
никогда не вызывается.Я знаю, что, возможно, мог бы связать textBox1.Text
напрямую с myClass
, или что может быть тысяча других возможных способов сделать то, что я пытаюсь сделать, но это всего лишь практика;Я пытаюсь лучше понять привязку данных.Поэтому я хочу связать пользовательский объект с пользовательским свойством, чтобы я мог видеть процесс от начала до конца.Пользовательский объект - myClass
, а пользовательское свойство - MyText
.Я пробовал все виды вариаций, например реализацию INotifyPropertyChanged
, но я не могу получить binding_Parse
для вызова (я ожидаю, что он будет вызван, когда я вызову changeMyTextButton_Click
).Я что-то упустил?
Редактировать: Проще говоря: я хочу написать пользовательский элемент управления со свойством string MyText
, которое затем пользователь может связать с чем-то другим, таким же образомВы можете связать свойство TextBox
Text
с чем-то другим.Поэтому я не хочу связывать свойство элемента управления с объектом, я хочу написать элемент управления со свойством, которое затем пользователь может связать с объектом.