Я не понимаю, почему что-то такое простое доставляет мне столько проблем, но все же. У меня есть такой конвертер:
public class BoolToVisibleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is bool && (bool)value)
return Visibility.Visible;
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (value is Visibility && (Visibility)value == Visibility.Visible);
}
}
и эта модель просмотра:
public class LoginViewModel: INotifyPropertyChanged
{
private bool isHowToVisibile;
public bool IsHowToVisible
{
get { return isHowToVisibile; }
set { isHowToVisibile = value; Notify(nameof(IsHowToVisible)); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void ShowHowTo()
{
IsHowToVisible = true;
}
}
В XAML у меня есть кнопка, которая активирует ShowHowTo и меняет IsHowToVisible на true,
и StackPanel, видимость которого я привязываю к свойству модели представления IsHowToVisible, это выглядит так:
<AppBarButton Label = "How To Play" Icon = "Help" Click = "{x:Bind loginViewModel.ShowHowTo}"/>
<StackPanel Name = "HowTo" Grid.ColumnSpan = "3" Grid.RowSpan = "6" Visibility = "{x:Bind loginViewModel.IsHowToVisible,Converter = {StaticResource boolToVis},Mode=OneWay}">
<Button Name = "CloseHowTo" Content = "Close" Click = "CloseHowTo_Click" HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "10,10,10,10"/>
<Image Source = "Assets/HowTo.jpg" Stretch = "Fill" Margin = "10,10,10,10"/>
</StackPanel>
XAML знает преобразователь следующим образом:
xmlns:con = "using:MyApp.Converters"
<Page.Resources>
<con:BoolToVisibleConverter x:Key = "boolToVis"/>
</Page.Resources>
Кнопка работает. Прогулка с отладчиком показывает, что свойство в модели представления действительно изменилось на true, и событие PropertyChanged действительно сработало. Но это все. Я поставил точку останова в конвертере, и он не попал.
Пробовал пересобрать и развернуть, поменять режим на Mode=TwoWay, ничего не помогает.
Что я делаю неправильно?





В моем тесте приведенный выше код работает хорошо, пожалуйста, убедитесь, что вы можете Перейти к определению (или F12), когда вы сосредотачиваетесь на <con:BoolToVisibleConverter /> xaml.
С другой стороны, если ваше приложение нацелено на Windows 10 версии 1607 и более поздних версий, вы можете удалить свой код BoolToVisibleConverter и не использовать Convert в вашем xaml. Начиная с Windows 10 версии 1607, платформа XAML предоставляет встроенный преобразователь логических значений в видимость. Конвертер сопоставляет true со значением перечисления Visible и false со значением Collapsed, поэтому вы можете связать свойство Visibility с логическим значением без создания конвертера. Обратите внимание, что это не функция привязки функций, а только привязка свойств. Для использования встроенного конвертера минимальная целевая версия SDK вашего приложения должна быть 14393 или более поздней. Вы не можете использовать его, если ваше приложение нацелено на более ранние версии Windows 10.
Если у вас все еще есть эта проблема, вы можете создать минимальный образец, который мог бы ее воспроизвести.
x:Bindпо умолчанию -OneTime, оценивается только один раз. Если начальное значение свойства истинно, будет ли вызываться конвертер и конвертироватьtrueвVisible? Если это так, преобразователь работает должным образом. Затем измените режим наOneWayилиTwoWay- ваш код работает в любом случае.