2009-12-16 43 views
30

Có cách nào để có một ràng buộc như là một giá trị dự phòng?WPF ràng buộc FallbackValue thiết lập để ràng buộc

Tôi đang cố gắng để làm một cái gì đó như thế này:

<Label Content="{Binding SelectedItem.Name, ElementName=groupTreeView, 
         FallbackValue={Binding RootGroup.Name}}" /> 

Nếu ai đã một trick để kéo nó đi, đó sẽ là tuyệt vời.

Trả lời

62

gì bạn đang tìm kiếm cái gì đó gọi PriorityBinding (# 6 trong danh sách this)

(từ bài viết)

Các điểm đến PriorityBinding là tên nhiều ràng buộc dữ liệu theo thứ tự của hầu hết các mong muốn ít nhất là mong muốn. Bằng cách này nếu ràng buộc đầu tiên không thành công, trống và/hoặc mặc định, một liên kết khác có thể diễn ra.

ví dụ:

<TextBox> 
    <TextBox.Text> 
     <PriorityBinding> 
      <Binding Path="LastNameNonExistant" IsAsync="True" /> 
      <Binding Path="FirstName" IsAsync="True" /> 
     </PriorityBinding> 
    </TextBox.Text> 
</TextBox> 
+23

Vấn đề là PriorityBinding coi chuỗi rỗng là một ràng buộc thành công – Shimmy

+4

từ [MSDN] (https://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding%28v=vs.110 % 29.aspx): 'Giá trị DependencyProperty.UnsetValue không được coi là giá trị trả về thành công.' - vì vậy chỉ cần sử dụng một Trình chuyển đổi trên ràng buộc của bạn trả về thuộc tính đó nếu giá trị của bạn là null. @Shimmy –

3

Trong điều kiện nào bạn muốn sử dụng giá trị Dự phòng? Làm thế nào bạn sẽ xác định rằng một ràng buộc đã thất bại? Một ràng buộc vẫn còn hợp lệ ngay cả khi nó bị ràng buộc với một giá trị null.

Tôi nghĩ rằng đặt cược tốt có thể là sử dụng trình chuyển đổi để chuyển đổi thành giá trị mặc định nếu giá trị trả về không trả về null. Tôi không chắc chắn làm thế nào bạn có thể mặc định với giá trị ràng buộc khác mặc dù.

Check-out converters here

+0

Trong trường hợp của tôi, đó là nơi tôi là 90% + chắc chắn rằng 'DataContext' sẽ có một thuộc tính cụ thể trên nó, nhưng tôi muốn quay trở lại để gọi'. ToString() 'ở đâu/nếu nó không. – tobriand

1

Nếu bạn gặp vấn đề với ràng buộc để các giá trị null và PriorityBinding (như Shimmy chỉ ra), bạn có thể đi với MultiBinding và MultiValueConverter như thế:

public class PriorityMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values.FirstOrDefault(o => o != null); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Cách sử dụng:

<TextBox> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource PriorityMultiValueConverter}"> 
      <Binding Path="LastNameNull" /> 
      <Binding Path="FirstName" /> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 
Các vấn đề liên quan