我不明白为什么这么简单的事情会给我带来很多麻烦,但仍然如此。 我有这个转换器:
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, 以及它的可见性绑定到视图模型属性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,没有任何帮助。 我在做什么错了?答案 0 :(得分:6)
在我的测试中,您的上述代码运行良好,请确保当您专注于<con:BoolToVisibleConverter />
xaml时,可以转到“定义”(或F12)。
反之,如果您的应用目标是Windows 10 1607版及更高版本,则可以删除BoolToVisibleConverter
代码,而无需在xaml中使用Convert。自从Windows 10版本1607开始以来,XAML框架提供了一个内置的布尔值到可见性转换器。转换器将true映射到Visible枚举值,将false映射到Collapsed,因此您可以将Visibility属性绑定到Boolean,而无需创建转换器。请注意,这不是函数绑定的功能,仅是属性绑定。要使用内置转换器,您应用的最低目标SDK版本必须为14393或更高版本。当您的应用程序针对Windows 10的早期版本时,您将无法使用它。
如果仍然存在此问题,则可以创建一个最小的示例来重现它。