2013-08-22 43 views
6

Tôi nhớ đọc một vài tuần trước rằng đôi khi nó không hoạt động bên trong các mẫu và gần đây tôi đã cố gắng liên kết mọi thứ trong hai cửa sổ khác nhau và không thể tìm thấy các khai báo tên, vì vậy tôi giả định rằng nó là địa phương không gian tên của lớp và chỉ bị ràng buộc bằng cách đặt datacontext thay thế. Tuy nhiên, tôi thực sự tò mò khi tôi có thể sử dụng tên phần tử ràng buộc và khi tôi không thể, bởi vì nó thuận tiện hơn nhiều khi có thể.Làm cách nào để binding elementname hoạt động chính xác?

chỉnh sửa: Khi đọc bài báo đó, tôi thấy điều này là thú vị:

"Vì lý do này, kiểu dáng và mẫu cả hai xác định namescopes XAML của riêng mình, không phụ thuộc vào bất cứ điều gì vị trí trong một cây đối tượng nơi phong cách hoặc mẫu được áp dụng."

nếu điều này đúng, điều đó có nghĩa là Binding ElementName không hoạt động trong các mẫu không? Nhưng sau đó tôi chắc chắn có một số ràng buộc làm việc trên ElementName trong các mẫu của tôi. Đó là phần khó hiểu nhất, tại sao một số ràng buộc ngẫu nhiên làm việc bên trong các khuôn mẫu và những người khác thì không? Nó phải có một số phương pháp để cố gắng giải quyết tên ngay cả khi nó không có trong mẫu hoặc cùng một tên kính

+1

'ElementName' ràng buộc chỉ hoạt động cho các yếu tố trong cùng [NameScope] (http://msdn.microsoft.com/en-us/library/ms746659.aspx) –

+0

mà namescope? như sau: xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" nhưng nếu chỉ là hai tệp đó thì tất cả các tệp của tôi đều có các tệp đó thì tôi có thể tham chiếu mọi thứ bằng cách sử dụng ElementName –

+1

Đó là 'Không gian tên', không phải là' Kính hiển vi '. Đó là 2 khái niệm khác nhau. 'Namespace' là một khái niệm' XML', và 'Namescope' là một khái niệm XAML. –

Trả lời

12

Về cơ bản bạn cần phải ở trong cùng một name scope (đọc phần này). Hầu hết các phần tử giao diện người dùng nằm trong cùng một cây chia sẻ cùng một phạm vi tên, tuy nhiên có thể có các ngắt và các rào cản (kiểu/mẫu) và nếu bạn có các đối tượng trừu tượng như các cột DataGrid thì chúng không có phạm vi tên nào cả.

Tôi đã làm việc với WPF đủ lâu để đoán khi nào tôi sẽ gặp vấn đề và tôi biết các khu vực chung nhưng không nghĩ rằng có một cách dễ dàng để nói trong mọi tình huống lên phía trước.


nếu điều này là đúng, không có nghĩa rằng Binding ElementName không nên làm việc trong các mẫu ở tất cả? Nhưng sau đó tôi chắc chắn có một số ràng buộc làm việc trên ElementName trong các mẫu của tôi.

Trong thời gian chỉ là tốt, đó là phạm vi tương tự. Điểm ở đây là nếu bạn áp dụng các mẫu và họ sẽ không có phạm vi riêng của họ sẽ có xung đột.

ví dụ:

<Button/> 
<Button/> 

Nếu chúng ta mở rộng ControlTemplate bạn sẽ nhận được một cái gì đó như:

<Border Name="bd" Background="{TemplateBinding Background}">...</Border> 
<Border Name="bd" Background="{TemplateBinding Background}">...</Border> 

Rõ ràng chúng ta sẽ nhận được một cuộc xung đột tên.

Tương tự cho DataTemplates trong ItemsControls, nếu bạn đặt tên cho điều khiển trong mẫu có tên sẽ xung đột với cùng một đối tượng kiểm soát trong mẫu được áp dụng của các mục khác.


Ngày lưu ý khác, bạn có thể ràng buộc từ bên trong một mẫu để bên ngoài vì logic chỉ có thể có một ví dụ với tên đó hoặc bạn có thể cung cấp cho họ một ưu tiên khác nhau dựa trên cách "chặt chẽ" phạm vi tên là , ví dụ

<TextBox Name="tb" Text="Test"/> 
<ItemsControl ItemsSource="ABC"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text, ElementName=tb}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Điều gì khiến * đối tượng trừu tượng như cột DataGrid * đặc biệt? Nó có liên quan đến cây thị giác không? – McGarnagle

+0

Vì vậy, nếu một số mục trong cây không có cùng một tên gọi thì tên không được truyền cho các mục trong tương lai ngay cả khi chúng có cùng tên gọi? –

+0

@McGarnagle: Có, chúng không có trong bất kỳ cây nào. –

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