如何绑定Binding.Converter属性?
How to bind the Binding.Converter property?
我想绑定到 Converter
属性 而不是使用 {StaticResource ResourceKey}
作为它的值。
实际上,我有一个带有自定义 UserControl 作为 ItemTemplate 的 ListView。项目使用 ItemConverter : IValueConverter
进行绑定。当我在 UserControl.Resources 中声明我的转换器时,会为每个列表项创建一个 ItemConverter
的实例,这是绝对没有必要的。我想创建一个转换器实例并将其传递给每个项目,这样我就可以在我的用户控件中执行以下操作:
<!-- not working -->
<TextBlock
Text="{Binding Converter={Binding something}}"
Foreground="Black"
FontSize="40"
/>
是否可以在 Windows 8.1 和 Windows Phone 8.1 的 通用商店应用程序中以某种方式做到这一点?有什么想法可以完全避免这样做吗?
我发现了一些与通用应用程序不兼容的过时项目:
- 18 Sep 2012: Bindable Converter, Converter Parameter and StringFormat
- 2 Jul 2013: Bindable Converter Parameter
是否有类似的通用应用程序?
I'd like to create a single converter instance
我在我的博客 (Xaml: Call Binding Converter Without Defining StaticResource in Xaml Thanks to Markup Derived Base Class in C#) 上写了一篇关于这种操作的方法的文章。
让我解释一下我自己的文章。
一旦使用基础 classes 的单例定义转换器,就不必在页面资源中创建转换器。
public class BooleanToVisibilityReverseConverter :
CoverterBase<BooleanToVisibilityReverseConverter>,
System.Windows.Data.IValueConverter
这里是 Xaml 中的访问示例(页面资源中没有创建静态)只是对转换器的简单命名空间访问:
<DataGrid Grid.Row="1"
Visibility="{Binding IsEditing,
Converter={ converters:BooleanToVisibilityReverseConverter }
}">
随后访问是直接在命名空间中,并且为每个页面只创建一个。
这里是基础class:
/// <summary>
/// This creates a Xaml markup which can allow converters (which inheirit form this class) to be called directly
/// without specify a static resource in the xaml markup.
/// </summary>
public class CoverterBase<T> : MarkupExtension where T : class, new()
{
private static T _converter = null;
public CoverterBase() { }
/// <summary>Create and return the static implementation of the derived converter for usage in Xaml.</summary>
/// <returns>The static derived converter</returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _converter ?? (_converter = (T) Activator.CreateInstance(typeof (T), null));
}
}
要获得更好的概述,请参阅我的博客文章。
Windows 8.1 和 Windows Phone 8.1.
的通用商店项目目前无法使用相关功能。
我想绑定到 Converter
属性 而不是使用 {StaticResource ResourceKey}
作为它的值。
实际上,我有一个带有自定义 UserControl 作为 ItemTemplate 的 ListView。项目使用 ItemConverter : IValueConverter
进行绑定。当我在 UserControl.Resources 中声明我的转换器时,会为每个列表项创建一个 ItemConverter
的实例,这是绝对没有必要的。我想创建一个转换器实例并将其传递给每个项目,这样我就可以在我的用户控件中执行以下操作:
<!-- not working -->
<TextBlock
Text="{Binding Converter={Binding something}}"
Foreground="Black"
FontSize="40"
/>
是否可以在 Windows 8.1 和 Windows Phone 8.1 的 通用商店应用程序中以某种方式做到这一点?有什么想法可以完全避免这样做吗?
我发现了一些与通用应用程序不兼容的过时项目:
- 18 Sep 2012: Bindable Converter, Converter Parameter and StringFormat
- 2 Jul 2013: Bindable Converter Parameter
是否有类似的通用应用程序?
I'd like to create a single converter instance
我在我的博客 (Xaml: Call Binding Converter Without Defining StaticResource in Xaml Thanks to Markup Derived Base Class in C#) 上写了一篇关于这种操作的方法的文章。
让我解释一下我自己的文章。
一旦使用基础 classes 的单例定义转换器,就不必在页面资源中创建转换器。
public class BooleanToVisibilityReverseConverter :
CoverterBase<BooleanToVisibilityReverseConverter>,
System.Windows.Data.IValueConverter
这里是 Xaml 中的访问示例(页面资源中没有创建静态)只是对转换器的简单命名空间访问:
<DataGrid Grid.Row="1"
Visibility="{Binding IsEditing,
Converter={ converters:BooleanToVisibilityReverseConverter }
}">
随后访问是直接在命名空间中,并且为每个页面只创建一个。
这里是基础class:
/// <summary>
/// This creates a Xaml markup which can allow converters (which inheirit form this class) to be called directly
/// without specify a static resource in the xaml markup.
/// </summary>
public class CoverterBase<T> : MarkupExtension where T : class, new()
{
private static T _converter = null;
public CoverterBase() { }
/// <summary>Create and return the static implementation of the derived converter for usage in Xaml.</summary>
/// <returns>The static derived converter</returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _converter ?? (_converter = (T) Activator.CreateInstance(typeof (T), null));
}
}
要获得更好的概述,请参阅我的博客文章。
Windows 8.1 和 Windows Phone 8.1.
的通用商店项目目前无法使用相关功能。