在Silverlight中,MVVM我必须创建一个属性窗口,但我只有一个
List<AProperty>
对象,其中AProperty
是一个带有一些子类的抽象类。
我想将它绑定到Silverlight控件(但是哪一个?),但有一些条件:
PropertyGroup
和一个Name
字段。订单必须是字母(PropertyGroup > Name
)任何想法或工作示例?
我的代码:
public abstract class AProperty {
private String _Name;
private String _Caption;
private String _PropertyGroup;
public String Name {
get { return _Name; }
set { _Name = value; }
}
public String Caption {
get { return _Caption; }
set { _Caption = value; }
}
public String PropertyGroup {
get { return _PropertyGroup; }
set { _PropertyGroup = value; }
}
}
List<AProperty> Properties;
和xaml:
<ListBox ItemsSource="{Binding ... Properties ...}">
<!-- Here order the items -->
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="250"
Text="{Binding Path=Caption}" />
<!-- And here need I a textbox, or a checkbox, or a combobox anyway -->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我发现值转换器仅用于控件属性,而不是整个堆栈面板内容。
答案 0 :(得分:1)
您可以使用值转换器来检查对象的类型并返回正确的控件类型。
你有任何示例代码,所以我可以给出一个更好的例子吗?
答案 1 :(得分:1)
ValueConverter Andy提及应该有效。在Textblock下面有一个ContentPresenter,并绑定它的内容。
Content = {Binding,ConverterParameter = {StaticResource NAMEOFCONVERTER}}。
由于您已将所需对象作为上下文,因此对该属性的绑定为空。然后只需检查类型并返回所需的控件。你可能想要创建只是Textblocks等的usercontrol,以便你可以在那里设置绑定,否则你必须在代码中进行。
答案 2 :(得分:0)
谢谢杰西和安迪,这是解决方案
转换器:
public class PropertyConverter : IValueConverter {
public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
Binding ValueBinding = new Binding() {
Source = value,
Path = new PropertyPath( "Value" ),
Mode = BindingMode.TwoWay
};
Binding EditableBinding = new Binding() {
Source = value,
Path = new PropertyPath( "Editable" ),
Mode = BindingMode.TwoWay
};
if( value is PropertyString ) {
TextBox tb = new TextBox();
tb.SetBinding( TextBox.TextProperty, ValueBinding );
tb.SetBinding( TextBox.IsEnabledProperty, EditableBinding );
return tb;
} else if( value is PropertyBoolean ) {
CheckBox cb = new CheckBox();
cb.SetBinding( CheckBox.IsCheckedProperty, ValueBinding );
cb.SetBinding( CheckBox.IsEnabledProperty, EditableBinding );
return cb;
} ....
return null;
}
public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
throw new NotImplementedException();
}
}
和xaml代码:
...
xmlns:Converters="clr-namespace:MyConverters"
...
<UserControl.Resources>
<Converters:PropertyConverter x:Key="PropertyInput"/>
</UserControl.Resources>
...
<ListBox ItemsSource="{Binding Path=ItemProperties.GeneralProperties}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180" />
<ColumnDefinition Width="320" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" Grid.Column="0" />
<ContentPresenter Content="{Binding Converter={StaticResource PropertyInput}}" Grid.Column="1" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
两个artikel: http://shawnoster.com/blog/post/Dynamic-Icons-in-the-Silverlight-TreeView.aspx http://www.silverlightshow.net/items/Silverlight-2-Getting-to-the-ListBoxItems-in-a-ListBox.aspx