2010-06-17 33 views
11

Trong WPF4.0, tôi có một lớp có chứa các loại lớp khác làm thuộc tính (kết hợp nhiều kiểu dữ liệu để hiển thị). Một cái gì đó như:ItemsControl ItemTemplate Binding

public partial class Owner 
{ 
    public string OwnerName { get; set; } 
    public int OwnerId { get; set; } 
} 

partial class ForDisplay 
{ 
    public Owner OwnerData { get; set; } 
    public int Credit { get; set; } 
} 

Trong cửa sổ của tôi, tôi có một ItemsControl như sau (cắt bớt cho rõ ràng):

<ItemsControl ItemsSource={Binding}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:MyDisplayControl 
       OwnerName={Binding OwnerData.OwnerName} 
       Credit={Binding Credit} /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

sau đó tôi nhận được một tập hợp các thông tin hiển thị từ các lớp dữ liệu, và thiết lập DataContext của số ItemsControl vào bộ sưu tập này. Thuộc tính "Tín dụng" được hiển thị chính xác, nhưng thuộc tính OwnerName thì không. Thay vào đó, tôi nhận được một lỗi ràng buộc:

Error 40: BindingExpression path error: 'OwnerName' property not found on 'object' ''ForDisplay' (HashCode=449124874)'. BindingExpression:Path=OwnerName; DataItem='ForDisplay' (HashCode=449124874); target element is 'TextBlock' (Name=txtOwnerName'); target property is 'Text' (type 'String')

Tôi không hiểu tại sao điều này đang nỗ lực để tìm kiếm tài sản OwnerName trong lớp ForDisplay, chứ không phải trong lớp Chủ đầu tư từ tài sản ForDisplay OwnerData.

Chỉnh sửa Dường như nó có liên quan đến việc sử dụng điều khiển tùy chỉnh. Nếu tôi liên kết các thuộc tính giống với một số TextBlock, chúng hoạt động chính xác.

<ItemsControl ItemsSource={Binding}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <local:MyDisplayControl 
         OwnerName={Binding OwnerData.OwnerName} 
         Credit={Binding Credit} /> 
       <TextBlock Text="{Binding OwnerData.OwnerName}" /> 
       <TextBlock Text="{Binding Credit}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+2

Bằng cách nào đó, nó đang cố gắng để tìm thấy những tài sản trên đối tượng ForDisplay OwnerName. Sử dụng liên kết sau để gỡ lỗi: http://wpftutorial.net/DebugDataBinding.html. Một câu hỏi nữa, thuộc tính OwnerName trên MyDisplayControl thuộc tính phụ thuộc của bạn? – decyclone

+1

Tôi thấy không có gì sai, giả sử những gì bạn cắt bớt là không che giấu bất cứ điều gì có liên quan. Bạn đã thử làm sạch/xây dựng lại giải pháp chưa? Tôi ghét đề nghị này vì nó tương đương với việc nói với bạn để "khởi động lại", nhưng tôi có một tình huống databinding rằng NÊN làm việc nhưng không, tôi thấy rằng một sạch/xây dựng lại đôi khi sửa chữa nó. Không chắc chắn lý do tại sao. –

+0

Dự đoán dự đoán: thay đổi Ràng buộc để đặt đường dẫn rõ ràng. tức là "OwnerName = {Binding Path = OwnerData.OwnerName}" –

Trả lời

7

Bạn có chắc chắn mã bạn đã đăng ở đây LÀ mã bạn sử dụng trong giải pháp của mình? Bởi vì, mã này làm việc cho tôi:

XAML tổ chức sự kiện Loaded

<ItemsControl ItemsSource="{Binding}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding OwnerData.OwnerName}"></TextBlock> 
       <TextBlock Text="{Binding Credit}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Window

ObservableCollection<ForDisplay> items = new ObservableCollection<ForDisplay>(); 

for (int i = 0; i < 10; i++) 
{ 
    items.Add(new ForDisplay() { OwnerData = new Owner() { OwnerId = i + 1, OwnerName = String.Format("Owner #{0}", i + 1) }, Credit = i + 1 }); 
} 

DataContext = items; 
+0

Tôi nghĩ nó có liên quan đến điều khiển tùy chỉnh. Xem chỉnh sửa câu hỏi. –

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