如何实现从字符串到可见性的转换器

本文关键字:字符串 可见性 转换器 何实现 实现 | 更新日期: 2023-09-27 17:51:18

所以我有一个ProgressRing和一个TextBlock,我试图实现这个基本的hack,这是显示两个元素时,TextBlock的文本被分配一个值(除null以外的任何东西),否则两个元素应该隐藏时,TextBlock的文本为空。

我的Xaml如下所示。TextBlock的Text被绑定到MessageForProgressRing,它的Visibility被绑定到MessageForProgressRingTargetNullValue。我也一样ProgressRing:

    <StackPanel Panel.ZIndex="100" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
        <mahControls:ProgressRing Height="50" IsActive="True" Width="50" Visibility="{Binding MessageForProgressRing, TargetNullValue=Collapsed, FallbackValue=Visible}" Foreground="White"  Margin="0,0,0.2,0" />
        <TextBlock Text="{Binding MessageForProgressRing}" Visibility="{Binding MessageForProgressRing, TargetNullValue=Collapsed, FallbackValue=Visible}"/>
    </StackPanel>

然后,在后面的代码中,我只是触发属性并在一些按钮事件处理程序上为它分配一个值:

private void closeApplicationButtonTask()
{
    ((CaptureViewModel)DataContext).MessageForProgressRing = "Closing... ";
    Application.Current.MainWindow.Close();
}

然而,在我的ViewModelBase(我所有的视图模型的父)它弹出一个错误的OnPropertyChanged说:

请求值"关闭中…"

我想我需要一个转换器,因为可见性绑定到Closing...对吗?如果是,我如何实现它?

p。我不能在OnPropertyChanged中这样做,因为我没有看到value来分配它。我也不认为这是一个好主意,因为它在执行之前,期间和之后被调用了很多次。

如何实现从字符串到可见性的转换器

我通常更喜欢通过在我的视图模型中有一个布尔属性来解决这个问题(例如HasMessageForProgressRing或IsProgressRingVisible)。它通常是一种更通用的解决方案。然后你可以使用boolean可视性转换器。

如果你真的想实现一个转换器,只需要创建一个实现IValueConverter的类。转换的实现对于您的简单用例来说应该是小菜一碟。在大多数情况下,ConvertBack是不必要的(在你的情况下也不会)。它看起来像这样:

public class NullToCollapsed : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null ? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}