所以我有一个ProgressRing
和一个TextBlock
,我正在尝试实现这个基本的hack,它是在TextBlock的Text被分配一个值(除null之外的任何东西)时显示这两个元素,否则当TextBlock的Text为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>
然后,在后面的代码中,我只触发属性并在某些按钮事件处理程序上为其赋值:
private void closeApplicationButtonTask()
{
((CaptureViewModel)DataContext).MessageForProgressRing = "Closing... ";
Application.Current.MainWindow.Close();
}
但是,在我的ViewModelBase
(我所有视图模型的父级)中,它在OnPropertyChanged
上弹出错误说:
未找到请求值'关闭...'。
我认为我需要转换器,因为可见性绑定到Closing...
对吗?如果是,我怎样才能实现它?
P.S我无法在OnPropertyChanged
中执行此操作,因为我没有看到value
分配它。此外,我认为这不是一个好主意,因为它在执行之前,期间和之后被称为大时间。
答案 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();
}
}