2012-02-14 22 views
18

Tại sao đoạn XAML sau đây cho tôi một XamlParseException với thông báo (vô nghĩa) "Loại biểu thức không phải là một giá trị Style hợp lệ." trong thời gian chạy?Sử dụng một TemplateBinding trong ControlTemplate.Triggers

<Control x:Class="TestApp.Max.MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:Max="clr-namespace:TestApp.Max" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <Control.Template> 
    <ControlTemplate> 
     <TextBlock Name="txt" Text="{TemplateBinding Max:MyControl.Foo}" /> 
     <ControlTemplate.Triggers> 
     <Trigger Property="Control.IsMouseOver" Value="True"> 
      <Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" /> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Control.Template> 
</Control> 

Dòng vi phạm là

<Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" /> 

Nếu tôi thay thế TemplateBinding với một bình thường Ràng buộc nó bắt đầu làm việc:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text2} 

tôi không nên có thể sử dụng một TemplateBinding từ Tôi đang ở trong ControlTemplate? Và thông điệp ngoại lệ thực sự có ý nghĩa gì?

+0

Tôi chỉ nghĩ rằng mình sẽ gắn chip vào vấn đề tương tự, hoàn toàn quên mất việc có thể sử dụng liên kết thường xuyên, cảm ơn công việc xung quanh. – Hugoagogo

Trả lời

0

Trình kích hoạt hoạt động tốt nhất khi được xác định theo kiểu độc lập, không phải nội dung tại chỗ. Thử xác định trình kích hoạt của bạn trong tài nguyên kiểu, sau đó tham chiếu tài nguyên kiểu từ mẫu của bạn.

+0

xin lỗi, không trả lời câu hỏi của tôi. tôi biết cách giải quyết vấn đề, nhưng muốn biết tại sao nó lại xảy ra. – stmax

2

Binding TemplatedParent: Trong dòng này giá trị của path2 sẽ áp dụng cho thuộc tính Text của TextBlock, vì vậy nó chạy tốt.

Trong mẫuBinding: Hãy xem xét kỹ điều này, Giá trị được giải quyết của Max: MyControl.Bar sẽ hoạt động như khóa tài nguyên cho mẫu binding [Ở đây giá trị của Bar không phải là giá trị thực, thay vào đó nó là một tên khóa bất động sản] không tồn tại và do đó nó ném lỗi "Khóa đã cho không có trong từ điển."

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