2009-05-15 32 views
15

Tôi có một loạt các điều khiển TextBlockTextBox. Có cách nào để áp dụng một Style cho các TextBlock s sao cho chúng có thể databind để kiểm soát ngay sau khi chúng?Trong WPF, có cách nào để liên kết với các thuộc tính anh chị em không?

Tôi muốn để có thể làm điều gì đó như thế này:

<Resources..> 
    <Style x:Key="BindToFollowingTextBoxSibling"> 
     <Setter Property="TextBlock.Text" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource MyConverter}}" /> 
     <Setter Property="TextBlock.Background" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource TextToBrushConverter}}" /> 
     ... More properties and converters. 
    </Style> 
</Resources> 

... 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 
<TextBlock Style="{StaticResource BindToPreviousTextBoxSibling}"/> 

là một cái gì đó như thế này thậm chí có thể?

Trả lời

14

Tôi nghĩ điều tốt nhất để làm trong trường hợp này được ràng buộc bởi ElementName:

<TextBlock Text="{Binding ElementName=textBox1, Path=Text}" /> 
<TextBox x:Name="textBox1">this is the textBox's 1 text</TextBox> 
<TextBlock Text="{Binding ElementName=textBox2, Path=Text}" /> 
<TextBox x:Name="textBox2">this is the textBox's 2 text</TextBox> 

Nó sẽ đạt được một cái gì đó tương tự. công việc này là dành cho bạn?

+0

Đó là loại gì tôi đang có khả năng sẽ làm gì. Vấn đề là có một số thuộc tính và bộ chuyển đổi mà tôi đang xem xét ràng buộc, vì vậy nó được nhiều bản sao và quá khứ để làm điều này cho mọi thuộc tính. Tôi nghĩ rằng tôi có thể ràng buộc bởi ElementName vào thẻ của TextBlock và sau đó sử dụng RelativeSource Self để có được các thuộc tính mà tôi cần. – Eclipse

+0

Điều này có bao giờ làm việc cho bạn không? – Carlo

+0

Tôi vừa mới tạo một điều khiển người dùng xử lý các trường hợp mà tôi cần. Nó dễ dàng hơn. – Eclipse

19

Tôi biết đây là một chuỗi cũ, nhưng tôi đã tìm thấy giải pháp cho vấn đề này. Tôi đã có thể sử dụng đề xuất của Aland Li, được tìm thấy here. Nó không hoàn toàn giống như trong CSS, nhưng nếu bạn biết loại phần tử gốc, nó hoạt động độc đáo ngay cả trong một kiểu.

Đây là ví dụ về cách tôi sử dụng nó. Tôi có một điều khiển TextBox sáng lên với một "màu sắc nổi bật" khi nó đã tập trung. Ngoài ra, tôi muốn điều khiển Nhãn liên quan của nó cũng sáng lên khi TextBox đã tập trung. Vì vậy, tôi đã viết một Trình kích hoạt cho điều khiển Nhãn làm cho nó sáng lên theo cách tương tự như điều khiển TextBox đã làm. Trình kích hoạt này được kích hoạt bởi một thuộc tính đính kèm tùy chỉnh được gọi là IsFocusedByProxy. Sau đó, tôi cần phải gắn kết IsFocusedByProxy của Label với IsFocused của TextBox. Vì vậy, tôi đã sử dụng kỹ thuật này:

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" 
      c5:TagHelper.IsFocusedByProxy="{Binding 
            Path=Children[1].IsFocused, 
            RelativeSource={RelativeSource AncestorType=Grid}}" 
     /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 

Tại thời điểm này, bạn có thể nghĩ rằng nó không tốt hơn là chỉ sử dụng ElementName trong Binding. Nhưng sự khác biệt là bây giờ tôi có thể di chuyển này ràng buộc vào một phong cách cho tái sử dụng:

<Setter Property="C5_Behaviors:TagHelper.IsFocusedByProxy" 
     Value="{Binding Path=Children[1].IsFocused, 
        RelativeSource={RelativeSource AncestorType=Grid}}" /> 

Và bây giờ tôi có thể khi tôi có một Xem đầy đủ của những lần xuất hiện, như thế này (tôi đã thiết lập các Styles cần thiết để được áp dụng ngầm, vì vậy đó là lý do tại sao không có đánh dấu cho thấy rằng đặt Styles):

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 
<Grid x:Name="MinGrid"> 
    <Label x:Name="MinLabel" 
      Content="Min:" /> 
    <c5:TextBoxC5Mediator x:Name="MinTextBox"       
          DataContext="{Binding ConfigVm.Min_mediator}" /> 
</Grid> 
<Grid x:Name="StepFactorGrid"> 
    <Label x:Name="StepFactorLabel" 
      Content="Step Factor:" /> 
    <c5:TextBoxC5Mediator x:Name="StepFactorTextBox"       
          DataContext="{Binding ConfigVm.StepFactor_mediator}" /> 
</Grid> 
<!-- ... and lots more ... --> 

nào mang lại cho tôi những kết quả:

Trước khi bất kỳ chữ Hộp có trọng tâm:

Before any TextBoxes have focus

Với textbox khác nhau nhận được tập trung:

after focus 1

after focus 2

+6

+1 cho '{Binding Path = Children [1] .IsFocused, RelativeSource = {RelativeSource AncestorType = Grid}}'. –

+0

Vì vậy, tôi giả định "1" trong Path = Trẻ em [1] ... là chỉ mục? Điều này đã làm việc cho tôi, nhưng muốn làm rõ ý nghĩa của giá trị số. – EdwardM

+1

@EdwardM Đúng, '1' trong' Đường dẫn = Trẻ em [1] 'là một chỉ mục (chỉ số dựa trên số không của khóa học). Vì vậy, bạn có thể điều chỉnh số đó nếu cấu trúc của bạn khác. Chúc mừng. –

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