Генерация формы ввода из словаря<String, Type>
Я строю систему плагинов, и я хочу, чтобы она была максимально динамичной - и так, я хочу панель настроек для нее тоже. Для этого я бы создал страницу настроек из словаря, где TKey определяет метку параметра, а TValue определяет тип параметра. Однако мне еще предстоит найти простой способ создания реального интерфейса. Я не хочу делать много, это была бы простая StackPanel с предопределенной парой TextBlock-TextBox - и каждая из них представляла бы одну из записей словаря.
Как это можно сделать простым способом?
1 ответ
Dictionary
не является оптимальным для связывания, так как KeyValuePair
возвращаемое значение является неизменным (и, следовательно, не может использоваться в двусторонней привязке).
Если вы все еще хотите сохранить данные в словаре, вы можете заключить их в класс, содержащий ключ (чтобы было что отображать в TextBlock
). Один из способов сделать это:
// some classes to represent our settings
public abstract class Parameter
{
public string Key { get; private set; }
public Parameter( string key ) { this.Key = key; }
}
public class StringParameter : Parameter
{
public string Value { get; set; }
public StringParameter( string key, string value ) : base( key )
{
this.Value = value;
}
}
Некоторые тестовые данные:
public Dictionary<string, Parameter> m_Settings = new Dictionary<string, Parameter>();
// NOTE: we're returning the dictionary values here only
public IEnumerable<Parameter> Settings { get { return m_Settings.Values; } }
...
var p1 = new StringParameter( "Parameter 1", "Value 1" );
var p2 = new StringParameter( "Parameter 2", "Value 2" );
var p3 = new StringParameter( "Parameter 3", "Value 3" );
m_Settings.Add( p1.Key, p1 );
m_Settings.Add( p2.Key, p2 );
m_Settings.Add( p3.Key, p3 );
И очень простой интерфейс:
<Window ...
xmlns:self="clr-namespace:WpfApplication8"
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<ItemsControl ItemsSource="{Binding Settings}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type self:StringParameter}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Key}"/>
<TextBox Text="{Binding Value, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Window>
Имея общую базу Parameter
позволяет вам иметь различные типы настроек, все со своими DataTemplate
, Обратите внимание, что все это не требует никакой проверки и всего того, что вам нужно.