所以我有一个 ProgressRing
和一个 TextBlock
并且我正在尝试实现这个基本的 hack,当 TextBlock 的文本被分配一个值(任何东西)时显示这两个元素null 除外),否则当 TextBlock 的 Text 为 null 时,两个元素都应隐藏。
我的 Xaml 如下所示。 TextBlock 的 Text 绑定(bind)到 MessageForProgressRing
,它的 Visibility 绑定(bind)到 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
(我所有 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/