Вот одно (несколько упрощенное) решение.
public class MyEntity : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly Dictionary<string, object> _customProps = new Dictionary<string, object>();
public void AddCustomProperty(string key, object value)
{
_customProps.Add(key, value);
}
public object this[string key]
{
get { return _customProps[key]; }
set
{
// The validation code of which you speak here.
_customProps[key] = value;
NotifyPropertyChanged("Item[" + key "]");
}
}
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
MainPage: -
public MainPage()
{
InitializeComponent();
MyEntity ent = new MyEntity();
ent.AddCustomProperty("Title", "Mr");
ent.AddCustomProperty("FirstName", "John");
ent.AddCustomProperty("Name", "Smith");
this.DataContext = ent;
}
MainPage Xaml: -
<TextBox Height="23" Name="TextBox1" Text="{Binding [Title], Mode=TwoWay}" />
<TextBox Height="23" Name="TextBox2" Text="{Binding [FirstName], Mode=TwoWay}" />
<TextBox Height="23" Name="TextBox3" Text="{Binding [Name], Mode=TwoWay}" />
Важным для вашей проблемы является то, что ваш код участвует в назначении значения свойства в словарь. Первоначально ваш код показал Dictionary
, вся работа по назначению проходила через код компонента фреймворка. В этой версии MyEntity
имеет индексатор строк, где пользовательские свойства назначаются напрямую, а Dictionary
делается приватным.
Обратите внимание, что реализация INotifyPropertyChanged
не является строго необходимой, чтобы ответить на ваш конкретный вопрос, но я подозреваю, что она вам понадобится. Например, если вы повторно назначаете новое значение пользовательскому свойству, вы хотите, чтобы пользовательский интерфейс был уведомлен.