我正在构建一个插件系统,我希望它尽可能动态 - 因此,我也想要一个设置面板。为此,我将从字典创建设置页面,其中 TKey 定义参数的标签,而 TValue 定义参数的类型。但是我还没有找到一种简单的方法来生成实际的 UI。我不想做太多,这将是一个简单的 StackPanel,具有预定义的 TextBlock-TextBox 对 - 其中每一个都代表一个 Dictionary 条目。
这怎么能以一种简单的方式完成呢?
我正在构建一个插件系统,我希望它尽可能动态 - 因此,我也想要一个设置面板。为此,我将从字典创建设置页面,其中 TKey 定义参数的标签,而 TValue 定义参数的类型。但是我还没有找到一种简单的方法来生成实际的 UI。我不想做太多,这将是一个简单的 StackPanel,具有预定义的 TextBlock-TextBox 对 - 其中每一个都代表一个 Dictionary 条目。
这怎么能以一种简单的方式完成呢?
ADictionary
对于绑定来说不是最优的,因为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 );
还有一个非常简单的 UI:
<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
. 请注意,所有这些都缺乏任何验证以及您需要的所有东西。