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

标签 c# wpf xaml

所以我有一个 ProgressRing 和一个 TextBlock 并且我正在尝试实现这个基本的 hack,当 TextBlock 的文本被分配一个值(任何东西)时显示这两个元素null 除外),否则当 TextBlock 的 Text 为 null 时,两个元素都应隐藏。

我的 Xaml 如下所示。 TextBlock 的 Text 绑定(bind)到 MessageForProgressRing,它的 Visibility 绑定(bind)到 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(我所有 View 模型的父级)中,它在 OnPropertyChanged 上弹出一个错误,说:

Requested value 'Closing...' was not found.

我想我需要一个转换器,因为 Visibility 绑定(bind)到 Closing... 对吗?如果是,我该如何实现?

P.S 我无法在 OnPropertyChanged 中执行此操作,因为我没有看到要分配给它的 value。此外,我认为这不是一个好主意,因为它在执行之前、期间和之后都会被调用很长时间。

最佳答案

我通常更喜欢通过在我的 View 模型中使用 bool 属性(例如 HasMessageForProgressRing 或 IsProgressRingVisible)来解决这个问题。它通常是一个更通用的解决方案。然后你可以使用 BooleanToVisibilityConverter .

如果你真的想实现一个转换器,只需创建一个实现 IValueConverter 的类. Convert对于您的简单用例来说,实现这个应该是小菜一碟。 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();
    }
}

关于c# - 如何实现从字符串到可见性的转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057522/

相关文章:

c# - 无法更新.net core中的javascript文件

c# - 当我 "new"时 ObservableCollection 失去绑定(bind)

c# - 当字体不支持符号时,如何在WPF文本框中插入版权,商标,服务标记等

wpf - 在 MyUserControl.xaml 中以声明方式设置 MyUserControl 的属性

wpf - 如何将 WPF TreeView HierarchicalDataTemplate 与 LINQ to Entities 一起使用?

C# 类运算符顺序

c# - XmlSerializer 的多个 namespace

c# - Asp.Net 核心 6 session key

wpf - VirtualizingStackPanel + MVVM + 多选

xaml - 绑定(bind)到 XAML 中的 Window.Current.Bounds.Width