问题描述
我在网上看到了两种不同的方法来增强一个的IValueConverter。其中一人来自的MarkupExtension自DependencyObject延伸出ValueConverter,其他。我无法从两个延伸,所以我不知道如果有一个比其他更好的?
I saw online 2 different approaches to enhancing an IValueConverter. One of them extended a ValueConverter from MarkupExtension, the other from DependencyObject. I can't extend from both, so I'm wondering if any one is better than the other?
推荐答案
从每个派生给你别样的功能和灵活性:
Deriving from each gives you different kind of power and flexibility:
-
从
的MarkupExtension
派生使您可以使用值转换器,而不使其成为一个静态资源,如下所述:
Deriving from
MarkupExtension
enables you to use the value converter without making it a static resource, as described below:
public class DoubleMe : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, /*rest of parameters*/ )
{
if ( value is int )
return (int)(value) * 2; //double it
else
return value.ToString() + value.ToString();
}
//...
}
在XAML ,你可以直接使用它,而无需创建静态资源:
In XAML, you can directly use it without creating a StaticResource:
<TextBlock Text="{Binding Name, Converter={local:DoubleMe}}"/>
<TextBlock Text="{Binding Age, Converter={local:DoubleMe}}"/>
这样的代码是非常方便的调试时,你可以只写地方: DebugMe
然后可以调试在其上使用该控件的DataContext的。
Such code is very handy when debugging, as you can just write local:DebugMe
and then can debug the DataContext of the control on which you use it.
从派生的DependencyObject
可让您的配置的一些喜好值转换器的更表达方式的,如下所述:
Deriving from DependencyObject
enables you to configure the value converter with some preferences in a more expressive way, as described below:
public class TruncateMe : DependencyObject, IValueConverter
{
public static readonly DependencyProperty MaxLengthProperty =
DependencyProperty.Register("MaxLength",
typeof(int),
typeof(TruncateMe),
new PropertyMetadata(100));
public int MaxLength
{
get { return (int) this.GetValue(MaxLengthProperty); }
set { this.SetValue(MaxLengthProperty, value); }
}
public object Convert(object value, /*rest of parameters*/ )
{
string s = value.ToString();
if ( s.Length > MaxLength)
return s.Substring(0, MaxLength) + "...";
else
return s;
}
//...
}
在XAML ,你可以直接使用它作为:
In XAML, you can directly use it as:
<TextBlock>
<TextBlock.Text>
<Binding Path="FullDescription">
<Binding.Converter>
<local:TruncateMe MaxLength="50"/>
</Binding.Converter>
</Binding>
</TextBlock.Text>
这是什么呢?它截断字符串 FullDescription ,如果它比 50
字符的更多!
What does it do? It truncates the string FullDescription
if it is more than 50
characters!
@crazyarabian评论说:
@crazyarabian commented that:
您声明自DependencyObject派生使您可以配置以更表达方式的一些喜好值转换器是不是独家的DependencyObject,你可以导致℃的的MarkupExtension创建相同的MaxLength属性,TextBlock的文本=结合年龄,转换器= {地方:DoubleMe,最大长度= 50}}/>
。我认为一个的MarkupExtension更表现力和更简洁。
这是真实的。但后来不是绑定;也就是说,当您从的MarkupExtension
派生,那么你可以这样做:
That is true. But then that is not bindable; that is, when you derive from MarkupExtension
, then you cannot do :
MaxLength="{Binding TextLength}"
但是,如果从派生您转炉 DependencyObject的
,那么你可以做以上。在这个意义上,它是的更传神的相比的MarkupExtension
。
But if you derive your converter from DependencyObject
, then you can do the above. In that sense, it is more expressive compared to MarkupExtension
.
注意目标属性必须是一个的DependencyProperty
为绑定
工作。
Note that the target property must be a DependencyProperty
for Binding
to work. MSDN says,
-
通常,每个绑定有四个组成部分:一个约束性目标
对象,目标属性,绑定
源,并在
结合源的值的路径。例如,如果
要在
的TextBox到
Employee对象的Name属性的内容绑定,你的目标对象是
文本框,目标属性是
Text属性,使用的值是
名称,并且源对象是
Employee对象。
目标属性必须是依赖属性。
这篇关于提高的IValueConverter - 的MarkupExtension或DependencyObject的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!