【发布时间】:2019-01-03 16:18:41
【问题描述】:
我不明白为什么这么简单的事情会给我带来这么多麻烦,但仍然如此。 我有这个转换器:
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,没有任何帮助。
我做错了什么?
【问题讨论】:
-
x:Bind默认为OneTime,只计算一次。如果属性的初始值为true,是否会调用converter,将true转换为Visible?如果是这样,则转换器按预期工作。然后将模式更改为OneWay或TwoWay- 无论哪种情况,您的代码都可以正常工作。
标签: mvvm uwp viewmodel uwp-xaml converters