- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近我读到一个IValueConverter
,它也继承自MarkupExtension
。它是这样的:
internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
private static BoolToVisibilityConverter converter;
public BoolToVisibilityConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Collapsed)
{
return false;
}
}
return true;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return converter ?? (converter = new BoolToVisibilityConverter());
}
}
用法比看起来像:
<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={local:BoolToVisibilityConverter}"/>
我习惯于使用来自 Resource 的转换器,例如:
<loc:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
...
<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToVisibilityConverter}"/>
我现在的第一个问题是:什么是更好的方法?如果我使用 MarkupExtension-Version
有什么优势(除了用法更容易输入)?
我还看到了一个非常相似的实现,如下所示:
internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
public BoolToVisibilityConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Collapsed)
{
return false;
}
}
return true;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
如果我理解正确,第一个解决方案只创建此转换器的一个实例。第二个为每个 XAML 创建此转换器的新实例,对吗?
最佳答案
使用我从未见过在线使用的 MarkupExtension
的一个巨大优势是它可以让您将值传递给转换器,该转换器可以用作参数或返回值,例如:
public class CustomNullToVisibilityConverter : MarkupExtension, IValueConverter
{
public object NullValue { get; set; }
public object NotNullValue { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return NullValue;
return NotNullValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
用法:
...
Visibility="{Binding Property,
Converter={cnv:CustomNullToVisibilityConverter
NotNullValue=Visible, NullValue=Collapsed}}" />
...
请务必在 .xaml
中引用转换器的命名空间。
编辑:
有一件事我忘了提,是的,你是对的,因为这种方法每次使用时都会创建一个新的转换器实例,这是一个缺点。
然而,没有什么可以阻止您将带有 MarkupExtension
的转换器添加到资源字典中 - 这样它只会被实例化一次。像这样:
<cnv:CustomNullToVisibilityConverter x:Key="NullToVisibilityConverter"
NotNullValue=Visible, NullValue=Collapsed />
...
Visibility="{Binding Property, Converter={StaticResource NullToVisibilityConverter}" />
...
关于c# - 带有 MarkupExtension 的 IValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28501091/
我正在尝试将枚举转换为画笔,以便可以使用枚举变量来控制某些控件的颜色 我的枚举(并不真正相关): public enum Colors { Red, Blue, } 这是我的转
我正在使用 .NET 3.5 我有一个 DataGridTextColumn,我想在该列的值为 false 时将背景颜色变为红色。我已经在 XMAL 中看到了这一点,但无法弄清楚如何在代码隐藏中做到这
我有一个 Enum 需要显示在 ComboBox 中。我已经设法使用 ItemsSource 将枚举值获取到组合框,并且我正在尝试将它们本地化。我认为这可以使用值转换器来完成,但由于我的枚举值已经是字
在谷歌上搜索这个问题几个小时,但看不出我哪里出错了。 我有以下转换器,它只返回 Brushes.Red(也尝试过 Colors.Red),但仍然没有成功。 public class ColorConv
我正在尝试创建一个 IValueConverter,它接受一个 enum 并吐出一个 URI。转换器确实按预期在运行时工作。然而,XAML Designer 给我一个错误提示: Object must
我有一个简单的 IValueConverter,它只使用 TypeConverter 进行转换。但是,在某些情况下,提供的 TypeConverter 会失败。 如果转换器未提供 Binding,我想
我有一个具有 3 种通信状态的应用程序:已连接、已断开连接和待处理。通信状态由一些其他参数控制。我想在 IValueConverter 控制的屏幕上显示相应的图像。但我无法让它工作。 这是我包含 3
我有一个 ListView,它有一个包含两列和许多行的 Grid。每行在每一列中都有一个 TextBlock,每个 Text 属性都绑定(bind)到 ListView 的 ItemSource 中的
我有一个包含大约 12 个项目的解决方案,其中一个设置为启动项目,其中包含主窗口。目前我所有的 IValueConverter 都在这个项目中。 我现在想将它们移动到一个单独的项目中,该项目将只包含转
IValueConverter 的最佳实践是什么? : 可以将 Exception 放在 Convert 方法中还是应该返回“something”? 这是一个例子: [ValueConversion(
我正在使用自定义 DateTimeToString :IValueConverter 在我的 ConvertBack 方法中,当转换失败时我抛出异常,但是它没有显示为验证失败(这是一个未处理的应用程序
我有一个异步方法,我想在 IValueConverter 中触发它。 有没有比通过调用 Result 属性强制它同步更好的方法? public async Task Convert(object va
我有一个进度条,我想根据 bool 值更改颜色; true 为绿色,false 为红色。我的代码看起来应该可以工作(当我将它绑定(bind)到文本框时它返回正确的值),但当它是进度条的颜色属性时却不行
我正在尝试使用 IValueConverter 将集合转换为代理对象以进行数据绑定(bind)。 转换器似乎工作正常,但问题是在集合中添加或删除新对象时。 View 中没有刷新相同的.. 模型对象:
我为自定义控件创建了一个 .cs 类,其中包含以下属性: //Property which is defining the unit of the textblock in the Ringsli
有谁知道是否可以对基于 IValueConverter 的类进行数据绑定(bind)? 我有以下转换器: [ValueConversion(typeof(int), typeof(Article))]
好吧,(在写了几次之后)发现System.Windows.Controls命名空间中已经有一个BooleanToVisibilityConverter,这真是一个惊喜。 可能还有更多这样隐藏的节省时间
我有这个代码: namespace Test { public partial class SearchField : UserControl { public Sea
我需要在转换器类中定义 DependencyProperty,因为我需要此数据来进行转换,并且此数据位于另一个对象中,而不是我绑定(bind)到的对象中。 我的转换器类如下: public class
我有这个代码: namespace Test { public partial class SearchField : UserControl { public Sea
我是一名优秀的程序员,十分优秀!