2012-07-06 83 views
0

是否有任何方法將ListBox的ItemsSource綁定到SeriaCollection XAxeLabels或YAxeLabels?綁定到返回子集合的集合中的屬性

如果沒有辦法 - 我想知道爲什麼 - 以及解決方法是什麼?

目前指定的綁定似乎沒有這樣做。

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> 

回答

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> 

雙方將顯示您的內容。

0

嘗試在你的容器類實現INotifyPropertyChanged的,並呼籲OnPropertyChanged以更新綁定 - 遺憾沒有在我的辦公桌上,現在,所以不能更具體的!