有没有办法将ListBox的“ItemsSource”绑定到SeriaCollection XAxeLabels或YAxeLabels?
如果没有办法 - 我想知道原因 - 以及解决方法是什么?
当前指定的Binding似乎没有这样做。
public class AxeLabel
{
public string Text { get; set; }
public Brush Foreground { get; set; }
public double X { get; set; }
public double Y { get; set; }
}
public class AxeLabels : ObservableCollection<AxeLabel>
{}
public class Seria
{
public string Name { get; set; }
public Brush Color { get; set; }
public double Thickness { get; set; }
public PointCollection Points { get; set; }
}
public class SeriaCollection : ObservableCollection<Seria>
{
public AxeLabels XaxeLabels { get; set; }
public AxeLabels YaxeLabels { get; set; }
}
<Window.Resources>
<my:SeriaCollection x:Key="mySeria">
<my:SeriaCollection.YaxeLabels>
<my:AxeLabel Text="3" X="0" Y="0" Foreground="Black" />
<my:AxeLabel Text="5" X="0" Y="-10" Foreground="Black" />
<my:AxeLabel Text="10" X="0" Y="-20" Foreground="Black" />
<my:AxeLabel Text="20" X="0" Y="-30" Foreground="Black" />
</my:SeriaCollection.YaxeLabels>
<my:SeriaCollection.XaxeLabels>
<my:AxeLabel Text="Jan-1-2013" X="0" Y="0" Foreground="Black" />
<my:AxeLabel Text="Jan-9-2013" X="20" Y="0" Foreground="Black" />
<my:AxeLabel Text="Jan-18-2013" X="40" Y="0" Foreground="Black" />
<my:AxeLabel Text="Jan-27-2013" X="60" Y="0" Foreground="Black" />
</my:SeriaCollection.XaxeLabels>
<my:Seria Name="FirstSeria" Thickness="2">
<my:Seria.Points>
<PointCollection>
<Point X="10" Y="10" />
<Point X="50" Y="50" />
<Point X="100" Y="30" />
</PointCollection>
</my:Seria.Points>
<my:Seria.Color>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="#FF8400FF" Offset="0" />
<GradientStop Color="#FF5EFF00" Offset="1" />
</LinearGradientBrush>
</my:Seria.Color>
</my:Seria>
<my:Seria Name="SecondSeria" Color="Blue" Thickness="6">
<my:Seria.Points>
<PointCollection>
<Point X="10" Y="60" />
<Point X="50" Y="30" />
<Point X="100" Y="20" />
</PointCollection>
</my:Seria.Points>
</my:Seria>
</my:SeriaCollection>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Source={StaticResource mySeria}, Path=YaxeLabels}" />
</Grid>
答案 0 :(得分:1)
在SeriaCollection
添加构造函数以创建ObservableCollection
s:
public class SeriaCollection : ObservableCollection<Seria>
{
public AxeLabels XaxeLabels { get; set; }
public AxeLabels YaxeLabels { get; set; }
public SeriaCollection()
{
XaxeLabels = new AxeLabels();
YaxeLabels = new AxeLabels();
}
}
使用ListBox.ItemTemplate
,例如
<ListBox ItemsSource="{Binding Source={StaticResource mySeria}, Path=YaxeLabels}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Text}" Width="100" />
<TextBlock Text="{Binding X}" Width="50" />
<TextBlock Text="{Binding Y}" Width="50" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
或使用DataType
属性为您的班级分配DataTemplate
:
<Window.Resources>
<DataTemplate DataType="{x:Type my:AxeLabel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Text}" Width="100" />
<TextBlock Text="{Binding X}" Width="50" />
<TextBlock Text="{Binding Y}" Width="50" />
</StackPanel>
</DataTemplate>
</Window.Resources>
两者都会显示您的内容。
答案 1 :(得分:0)
尝试在容器类上实现INotifyPropertyChanged,并调用OnPropertyChanged来更新绑定 - 对不起,现在就在我的办公桌上,所以不能更具体!