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

C# 如何实现从字符串到可见性的转换,c#,wpf,xaml,C#,Wpf,Xaml,因此,我有一个ProgressRing和一个TextBlock,我正在尝试实现这个基本的hack,即当TextBlock的文本被赋值(除null以外的任何值)时,显示这两个元素,否则当TextBlock的文本为null时,这两个元素都应该隐藏 我的Xaml如下所示。TextBlock的文本绑定到MessageForProgressRing,其可见性绑定到MessageForProgressRing和TargetNullValue。我也一样ProgressRing: <StackPa

因此,我有一个
ProgressRing
和一个
TextBlock
,我正在尝试实现这个基本的hack,即当TextBlock的文本被赋值(除null以外的任何值)时,显示这两个元素,否则当TextBlock的文本为null时,这两个元素都应该隐藏

我的Xaml如下所示。TextBlock的文本绑定到
MessageForProgressRing
,其可见性绑定到
MessageForProgressRing
TargetNullValue
。我也一样
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>
但是,在我的
ViewModelBase
(我所有视图模型的父视图)中,它会在
OnPropertyChanged
上弹出一个错误,说明:

找不到请求的值“正在关闭…”

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


另外,我无法在
OnPropertyChanged
中执行此操作,因为我看不到分配它的
值。此外,我认为这不是一个好主意,因为它在执行之前、执行期间和执行之后都会被大量调用。

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

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

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();
    }
}

你对此做过研究吗?在谷歌上搜索“wpf-IValueConverter”会得到大量的示例和教程,比如。@Charles是的,但一旦我知道关键词是什么(IValueConverter?)。谢谢我在看我的搜索可能过于具体,我链接到的教程是“wpf转换器”的第一个热门教程。你可能会原谅我认为你没有调查此事!酷。我正在做那件事
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();
    }
}