如何在Silverlight MVVM中绑定子对象列表

时间:2011-05-18 13:10:27

标签: silverlight mvvm bind

在Silverlight中,MVVM我必须创建一个属性窗口,但我只有一个 List<AProperty>对象,其中AProperty是一个带有一些子类的抽象类。

我想将它绑定到Silverlight控件(但是哪一个?),但有一些条件:

  1. 一些子属性必须显示为文本框,一些显示为复选框,一些显示为组合框。它来自动态类型。
  2. AProperty类有一个PropertyGroup和一个Name字段。订单必须是字母(PropertyGroup > Name
  3. 任何想法或工作示例?

    我的代码:

        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>
    

    我发现值转换器仅用于控件属性,而不是整个堆栈面板内容。

3 个答案:

答案 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