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

时间:2016-06-27 15:12:43

标签: c# wpf xaml

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

我的Xaml如下所示。 TextBlock的文字绑定到MessageForProgressRing,其可见性绑定到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.S我无法在OnPropertyChanged中执行此操作,因为我没有看到value分配它。此外,我认为这不是一个好主意,因为它在执行之前,期间和之后被称为大时间。

1 个答案:

答案 0 :(得分:3)

我通常更喜欢通过在视图模型中使用布尔属性来解决此问题(例如,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();
    }
}