2012-11-15 194 views
1

我有一個內置wpf的條形圖。用戶指定欄內的項目。WPF Usercontrol Items not showing

BarChart.xaml.cs

public partial class BarChart : UserControl 
{ 
    List<BarItem> BarItems = new List<BarItem>(); 
    List<Bar> Bars = new List<Bar>(); 
    public List<BarItem> Items 
    { 
     get { return BarItems; } 
     set 
     { 
      BarItems = value; 
      Bars.Clear(); 
      int i=0; 
      this.LayoutRoot.Children.Clear(); 
      //This line should show up but doesn't suggesting that that the property is not being set? 
      Debug.WriteLine("SET"); 
      foreach(BarItem Item in BarItems){ 
       Bar ThisBar=new Bar(); 
       ThisBar.CurrentLable=Item.Lable; 
       ThisBar.CurrentValue=Item.Value; 
       Debug.WriteLine("{0}:{1} at {2}",Item.Lable,Item.Value,(i*55)); 
       ThisBar.CurrentX=i*55; 
       this.AddChild(ThisBar); 
       i++; 
      } 
      Debug.WriteLine(i); 
     } 
    } 
    public BarChart() 
    { 
     this.InitializeComponent(); 
    } 
} 

BarChart.xaml

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:CipherCracker" 
mc:Ignorable="d" 
x:Class="CipherCracker.BarChart" 
x:Name="BarChartList" 
d:DesignWidth="640" d:DesignHeight="480"> 

<Grid x:Name="LayoutRoot"/> 
</UserControl> 

BarItem.cs

public class BarItem 
{ 
    public int Value 
    { 
     get; 
     set; 
    } 
    public string Lable 
    { 
     get; 
     set; 
    } 
    public BarItem() 
    { 

    } 

} 

要添加新BARCHART運行

<local:BarChart> 
    <local:BarChart.Items> 
     <local:BarItem Lable="B" Value="75"/> 
     <local:BarItem Lable="A" Value="50"/> 
    </local:BarChart.Items> 
</local:BarChart> 

然而根據輸出沒有項目被添加。我做錯了什麼,有沒有更好的方法?

+0

你是如何將BarItems添加到BarChart的? – Joulukuusi

+0

BarChart.xaml.cs中有一個名爲Items的屬性。此set屬性循環了各項並將它們添加到LayoutRoot – Bonzo

+0

@Rachel有答案,您說在調試窗口中存在「SET 0」。這意味着你正在設置'Items'錯誤。你可以向BarChart發佈添加項目的最小樣本嗎? – Joulukuusi

回答

1

我會做到這一點用結合。代碼隱藏將只是抱着一個屬性:

public partial class BarChart : UserControl 
{ 
    private List<BarItem> _items; 
    public List<BarItem> Items 
    { 
     get { return _items ?? (_items = new List<BarItem>()); } 
     set { _items = value; } 
    } 

    public BarChart() 
    { 
     InitializeComponent(); 
    } 
} 

雖然UI將做休息:

<ItemsControl ItemsSource="{Binding Items, ElementName=BarChartList}"> 

    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:Bar CurrentLable={Binding Lable} CurrentValue={Binding Value}/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 

</ItemsControl> 

什麼已經在UI被改變:

  • ItemsControl,不像Grid ,有用ItemsSource屬性,這使事情變得更容易;
  • StackPanel,與Grid不同,它不需要通過堆疊手動定位項目。如果您想在項目之間有空隙,您可以將local:Bar Margin設置爲一個常數值。
2

你的問題是屬性setter從來沒有被調用。

以您在XAML中所做的方式添加BarItem對象,將項目添加到現有列表實例中。只有在將列表設置爲新實例時纔會調用屬性設置器。

所以我會在代碼隱藏中創建一個新列表,並在那裏設置屬性。這樣做會調用setter,並且您的代碼將運行。您可能需要給BarChart一個名稱,以便您可以參考它。

XAML

<local:BarChart x:Name="bar"> 
    <!-- Doing this adds BarItems to the existing list. 
    <local:BarChart.Items> 
     <local:BarItem Lable="B" Value="75"/> 
     <local:BarItem Lable="A" Value="50"/> 
    </local:BarChart.Items> 
    --> 
</local:BarChart> 

代碼隱藏

public MainWindow() 
{ 
    InitializeComponent(); 

    //Setting the Items property to a new list, will call the setter.. 
    bar.Items = new List<BarItem> 
    { 
     new BarItem { Lable = "Test1", Value = 500 }, 
     new BarItem { Lable = "Test2", Value = 1000 }, 
     new BarItem { Lable = "Test3", Value = 1500 } 
    }; 
} 
2

另外我認爲你可以使用ObservableCollection<BarItem>來做到這一點,然後註冊到事件CollectionChanged來控制插入和刪除。

但我認爲這樣做的正確的方式,如果集合實現ICollectionChanged接口,你可以控制插入和刪除用於更新view.This應該是非常有用的,如果你可能需要使用ICollectionDependencyProperty,然後綁定到這個集合。

希望這可以幫助你,...