2012-03-27 27 views
13

Tôi đã tự hỏi liệu có thể ẩn điều khiển trên một khung nhìn không nếu thuộc tính mà điều khiển bị ràng buộc không tồn tại trong mô hình khung nhìn. Ví dụ: nếu tôi có các thông tin sau:MVVM - ẩn điều khiển khi thuộc tính bị ràng buộc không có mặt

<CheckBox Content="Quote" 
      IsChecked="{Binding Path=IsQuoted}" /> 

Tôi có thể phát hiện trong XAML rằng thuộc tính IsQuoted không tồn tại trên mô hình xem và chỉ cần ẩn điều khiển trong trường hợp đó.

Tôi về cơ bản đang tạo hộp thoại hướng dẫn di chuyển qua một bộ sưu tập các kiểu xem, hiển thị chế độ xem được liên kết cho mỗi kiểu. Đối với một số kiểu xem trong bộ sưu tập, thuộc tính "IsQuoted" sẽ có mặt, và đối với một số thì không.

Tôi muốn có hộp kiểm bên ngoài những chế độ xem này hiển thị khi mô hình chế độ xem hiện tại có thuộc tính và ẩn khi mô hình chế độ xem không hiển thị. Tất cả các mô hình xem được bắt nguồn từ một lớp cơ sở chung, nhưng tôi không muốn làm lộn xộn cơ sở bằng cách thêm thuộc tính "ShowQuoted", v.v.

Suy nghĩ? Và, cảm ơn trước ...

Trả lời

36

Xử lý trường hợp giá trị hiện diện bằng cách sử dụng trình biến đổi luôn trả về Khả năng hiển thị.Visible. Xử lý trường hợp không có giá trị bằng cách chỉ định giá trị dự phòng. Khi thuộc tính không có thì ràng buộc không thành công và nhận giá trị dự phòng.

<Page.DataContext> 
    <Samples:OptionalPropertyViewModel/> 
</Page.DataContext> 
<Grid> 
    <Grid.Resources> 
     <Samples:AlwaysVisibleConverter x:Key="AlwaysVisibleConverter" /> 
    </Grid.Resources> 
    <CheckBox 
     Content="Is quoted" 
     IsChecked="{Binding IsQuoted}" 
     Visibility="{Binding IsQuoted, 
        Converter={StaticResource AlwaysVisibleConverter}, 
        FallbackValue=Collapsed}" 
     /> 
</Grid> 

public class OptionalPropertyViewModel 
{ 
    public bool IsQuoted { get; set; } 
} 

public class AlwaysVisibleConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

    public object Convert(object value, 
          Type targetType, object parameter, CultureInfo culture) 
    { 
     return Visibility.Visible; 
    } 

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

    #endregion 
} 
+2

Làm mát. Tôi đã sử dụng WPF trong bốn năm và tôi không bao giờ nhận thấy tài sản FallbackValue (hoặc tôi đã làm và chỉ không chú ý vào thời điểm đó - khó nói). Điều này có thể có ích. – MetalMikester

+0

Nếu bạn muốn rõ ràng hơn, bạn có thể kiểm tra DependencyProperty.UnsetValue http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue%28v=vs.110%29. aspx –

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