2010-03-26 44 views
42

Trong trường hợp cụ thể của tôi, tôi muốn liên kết với thuộc tính IsReadOnly của một TextBox để đặt thuộc tính Nội dung của một Nút? Cả hai đều là một phần của cùng một StackPanel.Làm cách nào để liên kết với thuộc tính của điều khiển khác từ trình kích hoạt?

Tôi đã thử làm việc đó với một DataTrigger có Gắn kết với ElementName của TextBox và Trình kích hoạt bằng tên TextBox làm Tên nguồn.

Mọi suy nghĩ?

Trả lời

63

Bạn cần chỉ định trình kích hoạt làm một phần của kiểu - bộ sưu tập Trình kích hoạt trên nút chính nó chỉ có thể chứa trình kích hoạt sự kiện. Với ý nghĩ đó, một DataTrigger hoạt động tốt. Tuy nhiên, có một nếp nhăn: giá trị từ Trigger Setter sẽ không ghi đè lên một thuộc tính Nội dung cục bộ. Vì vậy, bạn cũng phải đặt Nội dung mặc định trong Kiểu. Dưới đây là cách hiển thị:

<Button> <!-- Note no content set directly on button --> 
    <Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="Content" Value="You may write!!!" /> <!-- Here is the 'normal' content --> 
     <Style.Triggers> 
     <!-- Here is how we bind to another control's property --> 
     <DataTrigger Binding="{Binding IsReadOnly, ElementName=textBox}" Value="True"> 
      <Setter Property="Content" Value="NO NO NO" /> <!-- Here is the 'override' content --> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 
+1

Ah ha! Tôi biết có một quyền ưu tiên tài sản, nhưng nó không xảy ra với tôi mà trực tiếp sẽ ghi đè hành động Trigger. Tôi đang sử dụng DP làm nguồn ràng buộc và kết thúc bằng việc thiếu hành vi tương tự như cố gắng sử dụng ElementName, do đó, vấn đề thực sự là với độ ưu tiên của thuộc tính. Cảm ơn bạn đã xóa thông tin đó! – rrhartjr

+0

điều này rất hay. chỉ cần những gì tôi cần, tôi đã gần như sẽ viết mã cho một công cụ chuyển đổi. nhưng điều này đẹp hơn. – user1841243

+0

> Tuy nhiên, có một nếp nhăn: giá trị từ Trigger Setter sẽ không ghi đè lên một thuộc tính Nội dung cục bộ. Điều này quan trọng! Tôi đã bỏ lỡ lần đầu tiên tôi đọc câu trả lời này. – SteveP

5

Các bạn đã thử này:

<StackPanel x:Name="LayoutRoot"> 
    <Button Width="75" Content="{Binding IsReadOnly, ElementName=textBox, Mode=Default}" /> 
    <TextBox x:Name="textBox" VerticalAlignment="Top" Text="TextBox" /> 
</StackPanel> 

??

+0

Anh ấy có thể muốn nút của mình nói điều gì đó có ý nghĩa hơn True hoặc False mặc dù \ * grin \ *. Mà bạn có thể làm bằng cách chèn một công cụ chuyển đổi, tất nhiên, nhưng kích hoạt cảm thấy thành ngữ hơn ... – itowlson

+0

Đánh dấu, tôi đã chỉnh sửa mã của bạn để loại bỏ một số bit không liên quan mà tôi cảm thấy khó thấy lõi của đề xuất của bạn. Hy vọng điều này là ổn - nếu bạn cảm thấy tôi đã bóp méo ý định của bạn thì hãy quay trở lại. – itowlson

+0

là tốt, cảm ơn vì điều đó, tôi chỉ cần đánh nó lên thật nhanh và có lẽ nên làm sạch nó :) – Mark

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