我有一个主要的未解决问题,我现在知道如何数据绑定到列表和单个项目,但是我还有一个问题,我需要将列表框绑定到类中的某些属性。 /> 例如,我有两个属性绑定在名为Display的类的某些XAML中:
Public Property ShowEventStart() As Visibility
Public Property ShowEventEnd() As Visibility
我可以在我的XAML中使用这些,但我希望它们位于ListBox /下拉列表中,如何让我的属性显示在此列表中并能够更改其值,是否必须是List列入清单?
我只是希望能够从下拉列表中修改这些属性,以使用下拉列表中的复选框切换ShowEventStart和ShowEventEnd属性值的可见性。
另外这必须是一个Silverlight 3.0解决方案,我无法弄清楚如何在XAML中绑定一些不是列表的东西,然后将其绑定为列表来修改这些项目!
我只需要一个可以改变类属性值的复选框列表,例如ShowEventStart和ShowEventEnd,还有其他属性,但这将是一个开始。
答案 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>
然后我可以绑定到我想要的两个属性(这个例子来自实际应用程序)。