2011-11-23 34 views
6

Tôi sẽ không sao chép/dán toàn bộ tệp xaml của mình. Nó sẽ là quá dài để giải thích nó nhưng đây là những gì là thú vị: Tôi có một ràng buộc của một tài sản "Tên"Ràng buộc với thuộc tính thứ 2 nếu thuộc tính thứ nhất là "không xác định"

<TextBlock Text="{Binding Name}"/> 

Điều này đôi khi, mặt hàng của tôi không có tài sản "Tên". Nó không sụp đổ nhưng tôi chỉ đơn giản có một văn bản trống trong TextBlock

Những gì tôi sẽ làm, nếu Tên trống, sẽ được liên kết với "không có gì", chỉ cần {Binding}. Điều này sẽ hiển thị tên đối tượng của tôi và nó sẽ được hoàn hảo!

Cảm ơn trước sự giúp đỡ nào, và xin lỗi nếu nó là một câu hỏi noobie :(

Trả lời

6

Những gì bạn muốn ở đây là một PriorityBinding.

Đặc biệt, nó sẽ giống như thế (cú pháp chính xác có thể cần một số xác minh):

  <TextBlock> 
      <TextBlock.Text> 
       <PriorityBinding> 
        <Binding Path="Name"/> 
        <Binding /> 
       </PriorityBinding> 
      </TextBlock.Text> 
     </TextBlock> 

Lưu ý rằng điều này đặc biệt rơi trở lại khi thuộc tính Name là không có sẵn trên các đối tượng bị ràng buộc; nếu thuộc tính Name có giá trị chuỗi rỗng, tôi tin rằng nó vẫn sẽ sử dụng giá trị rỗng đó.

+0

không được chấp nhận nhưng âm thanh của giải pháp ur tuyệt quá ! –

+0

Hãy thử:

+1

@Guillaume, Dylan sửa nó để hiển thị cú pháp đầy đủ; nói chung, '' là cú pháp XAML để thiết lập giá trị của một thuộc tính với một cấu trúc phức tạp hơn, chứ không phải là một giá trị nội tuyến. Phần mở rộng đánh dấu '{Binding ...}' chỉ là một lối tắt để tạo các cá thể lớp 'Binding' này. Trình biên dịch XAML sau đó thực hiện một số phép thuật đặc biệt bổ sung để nhận ra Text là DependencyProperty, vì vậy nó cho phép giá trị được 'đặt' thành một Binding, mà nó xử lý bằng cách gọi các hàm BindingOperations khác nhau cần thiết để nối mọi thứ lên. –

0

Nếu bạn không cần phải liên kết với tên loại đối tượng bạn có thể sử dụng TargetNullValue mà sẽ cung cấp cho bạn một giá trị mặc định nếu tài sản bị ràng buộc là null, như thế này:

<TextBlock Text="{Binding Name, TargetNullValue=Default}" /> 

Nếu bạn thực sự muốn tên loại đối tượng tôi sẽ đề nghị viết một chuyển đổi (thực hiện IValueConverter) Hãy cho tôi biết nếu bạn muốn có một chuyển đổi mẫu

+0

Với mã của bạn, tôi vẫn có TextBlocks trống khi đối tượng của tôi không có bất kỳ thuộc tính Tên nào. Không biết nếu nó có ý định hay không. Giới thiệu về Converter, tôi không thực sự biết, nó có vẻ đáng ngạc nhiên với tôi rằng chúng tôi không làm điều đó chỉ đơn giản trong tập tin xaml! –

+0

Các ràng buộc tài sản sẽ thất bại trong tình huống này để TargetNullValue sẽ không bao giờ được sử dụng. Bạn không thể có giá trị null cho mục tiêu nếu bạn không thể liên kết với mục tiêu. –

+0

Xin lỗi, tôi không hiểu rằng tài sản bị thiếu, tôi chỉ nghĩ rằng nó là null ("nếu Tên trống"). Lỗi của tôi. –

0

này.. là lý thuyết nhưng ..

Tôi sẽ tạo kiểu tùy chỉnh và nhắm mục tiêu tất cả các textblocks của bạn. Bên trong phong cách của bạn, bạn có thể đặt giá trị văn bản mặc định. Nếu ràng buộc của bạn không ghi đè kiểu, giá trị mặc định của bạn sẽ được sử dụng.

Style x:Key="TwitterTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="" /> 
+0

Tôi muốn giá trị mặc định là một Ràng buộc khác, không phải là giá trị tĩnh: ( –

3

Bạn có thể áp dụng một phong cách với một DataTrigger:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding Name}"/> 
      <Style.Triggers> 
       <!-- In this binding you could inject a converter which checks for more than null --> 
       <DataTrigger Binding="{Binding Name}" Value="{x:Null}"> 
        <Setter Property="Text" Value="{Binding}"/> 
       </DataTrigger> 
      <Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

Dường như làm việc nhưng tôi phải biết điều gì đó để chắc chắn, khi tôi chỉ sử dụng {Binding}. Trường nào được gắn kết? –

+0

@Guillaume, '{Binding}' có nghĩa là sử dụng giá trị của DataContext hiện tại làm giá trị để gán cho thuộc tính Nói cách khác, một Path rỗng có nghĩa là chỉ sử dụng cá thể đối tượng chứ không phải là một thuộc tính của nó. Cú pháp ràng buộc: http://www.nbdtech.com/Free/WpfBinding.pdf –

+1

@GuillaumeCogranne {Binding} sẽ liên kết với bất kỳ bối cảnh dữ liệu hiện tại nào của bạn được đặt thành.Vì vậy, thay vì liên kết với thuộc tính Name của một lớp, bạn liên kết với lớp có chứa thuộc tính Name. –

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