2016-12-27 11 views
5

Я создал и использовал bool для конвертеров видимости до и после дня, я забыл использовать конвертер на привязке (я использую традиционную привязку). Я привязал свойство видимости элемента управления, на мой взгляд, к свойству bool в моей модели представления и, на удивление, это работает. Поэтому мой вопрос в том, работает ли он с традиционным связыванием, зачем нам использовать преобразователи? Потому что кажется, что компилятор делает конверсию для меня.Почему bool работает для видимости без конвертера при использовании традиционного связывания

Я проверил это на UWP приложение в Visual Studio Update 3. Минимальная цель приложение 10.0.10586 Целевая версия 10.0.14393

+0

Откуда у вас возникла идея, что вы * использовали * для использования конвертера? –

+0

@EBrown Я всегда предполагал, и я видел, как люди использовали его в образцах кода, я думаю, я ошибся. –

+0

Это не нужно, если данные * не нуждаются в преобразовании. В случае с чем-то вроде 'bool', единственный раз, когда вы захотите его использовать, - это если значение' bool' является инверсией желаемого намерения. –

ответ

-1

Примечание: Я имею в виду Visible собственности и неVisibility в этом ответе.

Вы должны использовать IValueConverterесли свойство поставляя значение для Visible связывания является не простой bool типа, или требует сложного сравнения.

I.e. если у вас есть строка (public string Message { get; set; }), и вы хотите, чтобы кнопка привязывалась к Message.Length != 0, вы, очевидно, не можете привязываться к ней напрямую, поэтому вы можете привязать ее к Message и построить простой IValueConverter, который обрабатывает bool на основе Message.Length != 0. (Это не рекомендуется способа обработки ситуации, но это работает.)

На из самых нескольких раз вам понадобилось бы IValueConverter для bool ->bool в том случае, когда источник bool значение является инверсией желаемого результата. Если у вас есть кнопка, которая должна быть видна, когда public bool SomeProperty { get; set; } - false, то вы можете использовать IValueConverter, чтобы инвертировать значение этого bool, чтобы быть желаемым результатом.

+0

Но 'Видимость! = Bool'. –

+0

@HenkHolterman 'Видимость' не может быть' bool', но в этом случае * 'Visible' * is. –

+0

В вопросе нет «видимого». И 'Control.Visibility' имеет тип' Видимость'. –

7

Интересно. Это всегда было болью, и, похоже, она была исправлена ​​без большой рекламы, я этого не знал.

В WPF вам всегда приходилось использовать ValueConverter, потому что Visibility не является bool.

Я только что удалил преобразование BooleanToVisibility из {x:Bind ...} в свой проект и действительно все еще работает. Я откопал это вверх от сгенерированного кода:.

private void Update_ViewModel_ShowMessage(global::System.Boolean obj, int phase)    
{ 
    ... 
    this.Update_ViewModel_ShowMessage_Cast_ShowMessage_To_Visibility(
    obj ? global::Windows.UI.Xaml.Visibility.Visible 
     : global::Windows.UI.Xaml.Visibility.Collapsed 
    , phase); 
... 
} 

Таким образом, очевидно, что в настоящее время построен в

Update:

Для {x:Bind } было объявлено here, как часть обновления юбилейной. И вам нужно настроить таргетинг 14393 или новее. Для старых построек он работает только в {Binding ...}.

+0

Я предполагаю, что если вы хотите «Скрытый» вместо «Свернутый», вам все равно придется использовать конвертер. –

+0

В UWP 'Hidden' больше не существует ... Видимость - это перечисление с двумя членами. –

+0

Ах, и это освобождает путь для автоматического преобразования. –