Моя базовая структура данных состоит из иерархии объектов, построенных на общем абстрактном классе:
public abstract class model {
public string name {get;};
public string type {get;};
}
public class A:model {
public int val1 {get; set;};
}
public class B:model {
public int val2 {get; set;};
}
public class C:B {
public Dictionary<string, int> extra_props;
}
Моя цель - создать пользовательский интерфейс, который после выбора объекта может динамически просматривать, но также и изменять базовые свойства объекта.
Я абсолютный новичок в отношении WPF, поэтому я не знаю, каковы его полные возможности. А пока что касается свойств с одним значением, я нашел способ использовать привязку данных для привязки свойств к элементам пользовательского интерфейса. Он работает как брелок для показа и изменения значений.
<GroupBox x:Name="InfoBox" Header="Object Information">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="41*"/>
<ColumnDefinition Width="200*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="50*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Grid.ColumnSpan="2" >
<TextBlock>Name:</TextBlock>
<TextBlock Text="{Binding name}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
<DockPanel Grid.Row="1" Grid.ColumnSpan="2" >
<TextBlock>Type:</TextBlock>
<TextBlock Text="{Binding type}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
<DockPanel Grid.Row="2" Grid.ColumnSpan="2" >
<TextBlock>Material Name:</TextBlock>
<TextBlock Text="{Binding val1}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
</Grid>
</GroupBox>
Задача 1:
Когда объект типа B
связан, свойство val1
не существует, и я получаю некоторые BindingErrors в выходных данных отладки. Они не вызывают никаких проблем во время выполнения, но я не нашел способа перехватить их и вернуть значение по умолчанию или что-то еще.
Единственный способ, который я задумал для решения этой проблемы, - это добавить все требуемые свойства в абстрактный класс, чтобы они все существовали во всех производных классах с некоторыми нулевыми значениями или чем-то, но это не так все.
Задача 2:
Для более сложных классов, таких как C
, я хочу динамически генерировать пользовательский интерфейс на основе набора / списка свойств класса. На данный момент я абсолютно не знаю, как это сделать с привязкой данных, за исключением добавления их всех по одному в XML и решения проблем 1. 1. 1020 *
Самое жизнеспособное решение, о котором я подумал, - это программно сгенерировать элемент управления и добавить его в главное окно с текстовыми полями и входными данными для нужных мне свойств класса, и, опять же, программно, надеюсь, мы сможем привязать объект к элементу управления, чтобы что значения считываются / устанавливаются соответствующим образом. Очевидно, этот метод решит и проблему 1.
Я даже не уверен, возможно ли это решение или нет, но в любом случае мне нужны рекомендации и советы, главным образом, если есть способ решить мои проблемы с привязкой данных или мне следует пойти с программным обновлением пользовательский интерфейс (если возможно).