2011-08-24 25 views
25

Tôi có danh sách các mục mà tôi muốn hiển thị trong Canvas bằng cách sử dụng ràng buộc dữ liệu.Cách hiển thị các mục trong Canvas qua Binding

ItemsToShowInCanvas = new ObservableCollection<ItemDetail> 
    { 
     new ItemDetail {Text = "ABC", Top = 10, Left = 200}, 
     new ItemDetail {Text = "DEF", Top = 100, Left = 300}, 
     new ItemDetail {Text = "PQR", Top = 50, Left = 150} 
    }; 

ItemDetail là một lớp đơn giản với tính chất tự động cho Text, Top và Left giá trị

public class ItemDetail 
{ 
    public string Text { get; set; } 
    public double Top { get; set; } 
    public double Left { get; set; } 
} 

Khi tôi DataBind các mục, họ xuất hiện trong canvas. Nhưng các mục không xuất hiện ở các vị trí được đề cập bằng cách sử dụng thuộc tính trên cùng và bên trái.

<Canvas> 
    <ItemsControl ItemsSource="{Binding Path=ItemsToShowInCanvas}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=Text}" Canvas.Top="{Binding Path=Top}" Canvas.Left="{Binding Path=Left}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Canvas> 
+2

ItemsControl sử dụng StackPanel như ItemsPanel mặc định. textblock mà bạn đang thêm vào thực sự đang thêm vào một stackpanel nhưng không thêm vào canvas. ItemsControl đang thêm vào canvas. Hãy thử thay đổi itemspanel thành canvas – Bathineni

+0

Cảm ơn câu trả lời bathineni. Tôi đã thử đặt ItemsPanel là Canvas nhưng nó không hoạt động. Các mục bắt đầu hiển thị cái này qua cái kia. Thêm ItemContainerStyle đã làm việc. –

+0

có thể trùng lặp của [WPF: Có thể liên kết thuộc tính Trẻ em của Canvas trong XAML không?] (Http://stackoverflow.com/questions/889825/wpf-is-it-possible-to-bind-a-canvass-children -property-in-xaml) –

Trả lời

37

Đặt ItemsPanel đến một Canvas và ràng buộc container thay vì TextBlock trong DataTemplate

<ItemsControl ItemsSource="{Binding Path=ItemsToShowInCanvas}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="ContentPresenter"> 
      <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
      <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Text}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Nếu tôi có một 'Hình dạng' thay vì một' TextBlock', tôi có thể thay thế một cái bằng cái khác không? – IAbstract

+0

Ngoài ra, 'ItemsControl' nằm ở đâu trong cây tài liệu? – IAbstract

+0

ItemsControl.ItemsContainerStyle chỉ là những gì tôi cần tôi có phần còn lại làm việc. Cảm ơn một bó. – Grenter

Các vấn đề liên quan