如何将ListBox绑定到类中的属性?

时间:2009-09-02 17:07:33

标签: silverlight xaml list properties

我有一个主要的未解决问题,我现在知道如何数据绑定到列表和单个项目,但是我还有一个问题,我需要将列表框绑定到类中的某些属性。 /> 例如,我有两个属性绑定在名为Display的类的某些XAML中:

Public Property ShowEventStart() As Visibility
Public Property ShowEventEnd() As Visibility

我可以在我的XAML中使用这些,但我希望它们位于ListBox /下拉列表中,如何让我的属性显示在此列表中并能够更改其值,是否必须是List列入清单?
我只是希望能够从下拉列表中修改这些属性,以使用下拉列表中的复选框切换ShowEventStart和ShowEventEnd属性值的可见性。

另外这必须是一个Silverlight 3.0解决方案,我无法弄清楚如何在XAML中绑定一些不是列表的东西,然后将其绑定为列表来修改这些项目!

我只需要一个可以改变类属性值的复选框列表,例如ShowEventStart和ShowEventEnd,还有其他属性,但这将是一个开始。

3 个答案:

答案 0 :(得分:1)

您可以创建一个PropertyWrapper类,并在窗口代码中公开一个返回List<PropertyWrapper>的属性并将ListBox.ItemsSource绑定到它。

public class PropertyWrapper
 {
  private readonly object target;
  private readonly PropertyInfo property;

  public PropertyWrapper(object target, PropertyInfo property)
  {
   this.target = target;
   this.property = property;
  }

  public bool Value
  {
   get
   {
    return (bool) property.GetValue(target, null);
   }
   set
   {
    property.SetValue(target, value, null);
   }
  }

  public PropertyInfo Property
  {
   get
   {
    return this.property;
   }
  }
 }

你的窗口代码背后:

public partial class Window1 : Window, INotifyPropertyChanged
 {
public Window1()
  {
   InitializeComponent();

   properties = new List<PropertyWrapper>
                 {
                  new PropertyWrapper(this, typeof(Window1).GetProperty("A")),
        new PropertyWrapper(this, typeof(Window1).GetProperty("B")),
                 };

   this.DataContext = this;
  }

  private List<PropertyWrapper> properties;
  public List<PropertyWrapper> Properties
  {
   get { return properties; }
  }


  private bool a;

  private bool b = true;

  public bool A
  {
   get
   {
    return a;
   }
   set
   {
    if (value != a)
    {
     a = value;
     NotifyPropertyChange("A");
    }
   }
  }

  public bool B
  {
   get
   {
    return b;
   }
   set
   {
    if (value != b)
    {
     b = value;
     NotifyPropertyChange("B");
    }
   }
  }

  protected void NotifyPropertyChange(string propertyName)
  {
   if (PropertyChanged != null)
   {
    PropertyChanged.Invoke(
     this, new PropertyChangedEventArgs(propertyName));
   }
  }

  public event PropertyChangedEventHandler PropertyChanged;
 }

你的窗口标记:

            <ListBox ItemsSource="{Binding Path=Properties}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=Property.Name}"/>
                            <CheckBox IsChecked="{Binding Path=Value}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

希望这有帮助

答案 1 :(得分:0)

我试图模仿类似的东西。看看这对你有什么用,如果我误解了这个问题,请告诉我。

来自MainPage.xaml:

<StackPanel Orientation="Horizontal">
        <ListBox SelectedItem="{Binding ShowControls, Mode=TwoWay}" x:Name="VisibilityList"/>
        <Button Content="Test" Visibility="{Binding ShowControls}"/>
        <CheckBox Content="Test 2" Visibility="{Binding ShowControls}"/>
    </StackPanel>

MainPage.xaml.cs背后的代码:

public partial class MainPage : UserControl
    {
        VisibilityData visibilityData = new VisibilityData();

        public MainPage()
        {
            InitializeComponent();

            VisibilityList.Items.Add(Visibility.Visible);
            VisibilityList.Items.Add(Visibility.Collapsed);

            this.DataContext = visibilityData;
        }
    }

数据类:

public class VisibilityData : INotifyPropertyChanged
    {
        private Visibility showControls = Visibility.Visible;

        public Visibility ShowControls
        {
            get { return showControls; }
            set
            {
                showControls = value;
                OnPropertyChanged("ShowControls");
            }
        }

        private void OnPropertyChanged(string p)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(p));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

当您运行该代码时,您应该获得一个ListBox,其中包含Visible和Collapsed选项,当您选择一个选项时,您应该会看到该按钮的可见性,并且复选框已更改以反映您的选择。如果那不是您想要的,请告诉我。

答案 2 :(得分:0)

在考虑了这个问题后,解决方案发生在我身上,即在XAML中构建List,然后使用Checkboxes上的Converter将其布尔IsChecked转换为Class中的Property Visibility属性。
您可以创建一个列表,如:

            <ComboBox Canvas.Left="6" Canvas.Top="69" Width="274" Height="25" Name="Display">
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=Display.EventStart,Mode=TwoWay,Converter={StaticResource VisibilityConverter}}"/>
                    <TextBlock Text="Event Start"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=Display.EventEnd,Mode=TwoWay,Converter={StaticResource VisibilityConverter}}"/>
                    <TextBlock Text="Event End"/>
                </StackPanel>
            </ComboBox>

然后我可以绑定到我想要的两个属性(这个例子来自实际应用程序)。