2010-05-11 23 views
23

Tôi có một IMultiValueConverter cực kỳ đơn giản chỉ đơn giản là hai giá trị của OR. Trong ví dụ dưới đây, tôi muốn đảo ngược giá trị đầu tiên bằng cách sử dụng một biến tần boolean đơn giản.Tại sao tôi nhận được DependencyProperty.UnsetValue khi chuyển đổi giá trị trong MultiBinding?

<MultiBinding Converter="{StaticResource multiBoolToVis}"> 
    <Binding Path="ConditionA" Converter="{StaticResource boolInverter}"/> 
    <Binding Path="ConditionB"/> 
</MultiBinding> 

và biến tần:

public class BoolInverterConverter : IValueConverter 
{ 
    #region IValueConverter Members 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      return !((bool)value); 
     } 
     return null; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    #endregion 
} 

Khi tôi bao gồm các boolInverter, giá trị đầu tiên trong MultiValueConverter trở thành một "DependencyProperty.UnsetValue". Không có vấn đề gì khi tôi không sử dụng bộ chuyển đổi (không phải là logic mà tôi đang hướng tới, tất nhiên).

Tôi có thiếu gì đó không? Bước qua trình gỡ lỗi cho thấy rằng InverseBoolConverter đã đảo ngược giá trị mà tôi truyền nó, nhưng giá trị đó không được 'gửi' tới MultiValueConverter.

+0

xem thông báo này: http://stackoverflow.com/questions/683863/items-collection-must-be-empty-before-using-itemssource – mkb

Trả lời

25

Từ MSDN:

UnsetValue là một giá trị trọng điểm được sử dụng cho các kịch bản mà hệ thống sở hữu WPF là không thể xác định một giá trị thuộc tính phụ thuộc yêu cầu. UnsetValue được sử dụng thay vì tham chiếu null (Không có gì trong Visual Basic), vì tham chiếu null có thể là một giá trị thuộc tính hợp lệ, cũng như một DefaultValue hợp lệ (và thường được sử dụng).

Có nghĩa là một trong những điều sau đây:

  • Bạn sử dụng một mẫu (ControlTemplate hoặc DataTemplate), và giá trị không có một DataSource thiết lập tại thời điểm được Loaded. Vì vậy, nó sẽ nhấn công cụ chuyển đổi của bạn hai lần, đầu tiên với UnsetValue, thứ hai với giá trị boolean; vì vậy không có gì phải lo lắng;
  • bạn Binding là không chính xác, có nghĩa là ràng buộc không thể xác định một giá trị, do đó dẫn đến việc UnsetValue .. Bạn propbably sẽ thấy một cảnh báo ..

Ngoài ra, bạn có thể không kết hợp chuyển đổi như bạn làm .. Vì vậy, nó có lẽ đó.

Tháo bộ chuyển đổi ở bên trong Binding, và nó phải được cố định! :)

Hy vọng điều này sẽ hữu ích!

+0

Thật sao? Vì vậy, tôi sẽ phải có một tài sản gương, "InverseConditionA", để làm những gì tôi đang cố gắng? Kinh quá! –

+0

Vâng, hoặc mở rộng MultiValueConverter của bạn với các thông số, để đảo ngược boolean đầu tiên? – Arcturus

+0

Làm cách nào để kiểm tra xem một 'giá trị' cụ thể trong bộ chuyển đổi có dependencyproperty.unsetvalue? Tôi có nghĩa là nếu tôi muốn đúc giá trị để Int sau đó nó sẽ ném một lỗi như (Int32) giá trị - như giá trị là dependencyproperty.unsetvalue. bất kỳ ý tưởng? – Rohit

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