在 IValueConverter class 中定义 属性
Defining a Property in a IValueConverter class
我需要在转换器中定义一个 DependencyProperty class 因为我需要这些数据来进行转换并且这个数据在另一个对象中,而不是我要绑定的对象中。
我的转换器 class 如下:
public class LEGOMaterialConverter : DependencyObject, IValueConverter
{
public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
public Dictionary<int, LEGOMaterial> MaterialsList
{
get
{
return (Dictionary<int, LEGOMaterial>)GetValue(MaterialsListProperty);
}
set
{
SetValue(MaterialsListProperty, value);
}
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
LEGOMaterial material = null;
MaterialsList.TryGetValue((int)value, out material);
return material;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后我在 Window.REsources 区域实例化它:
<Window.Resources>
<local:LEGOMaterialConverter x:Key="MaterialsConverter" MaterialsList="{Binding Path=Materials}" />
</Window.Resources>
我收到以下错误:
'MaterialsList' property was already registered by 'LEGOMaterialConverter'.
有人知道这个错误吗?
尝试这样做(只是一个例子):
public class ValueConverterWithProperties : MarkupExtension, IValueConverter
{
public int TrueValue { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((int) value == TrueValue)
{
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
请注意,我从标记扩展派生而来,允许我像这样使用它:
<Window x:Class="Converter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converter="clr-namespace:Converter"
Title="MainWindow" Height="350" Width="525">
<Grid>
<CheckBox IsChecked="{Binding item, Converter={converter:ValueConverterWithProperties TrueValue=5}}"></CheckBox>
<CheckBox IsChecked="{Binding item2, Converter={converter:ValueConverterWithProperties TrueValue=10}}"></CheckBox>
</Grid>
顺便说一句,这个错误是由于你在转换器中的依赖性 属性 不是静态的(并且之前在某处创建了这个转换器的实例之后)。
编辑
所以问题出在这一行:
public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
此处,依赖项 属性 MaterialsListProperty
正在注册 与此类型对象(即 LEGOMaterialConverter
)的每个实例化。
然而,依赖属性应该定义为静态的,如下所示:
public static readonly DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
一个静态变量只被初始化一次(并且依赖项属性 被注册)对于这个类型的所有未来的实例只有一次,这就是我们在这里所需要的。未能将依赖项 属性 声明为静态会导致上述错误。
我需要在转换器中定义一个 DependencyProperty class 因为我需要这些数据来进行转换并且这个数据在另一个对象中,而不是我要绑定的对象中。
我的转换器 class 如下:
public class LEGOMaterialConverter : DependencyObject, IValueConverter
{
public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
public Dictionary<int, LEGOMaterial> MaterialsList
{
get
{
return (Dictionary<int, LEGOMaterial>)GetValue(MaterialsListProperty);
}
set
{
SetValue(MaterialsListProperty, value);
}
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
LEGOMaterial material = null;
MaterialsList.TryGetValue((int)value, out material);
return material;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后我在 Window.REsources 区域实例化它:
<Window.Resources>
<local:LEGOMaterialConverter x:Key="MaterialsConverter" MaterialsList="{Binding Path=Materials}" />
</Window.Resources>
我收到以下错误:
'MaterialsList' property was already registered by 'LEGOMaterialConverter'.
有人知道这个错误吗?
尝试这样做(只是一个例子):
public class ValueConverterWithProperties : MarkupExtension, IValueConverter
{
public int TrueValue { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((int) value == TrueValue)
{
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
请注意,我从标记扩展派生而来,允许我像这样使用它:
<Window x:Class="Converter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converter="clr-namespace:Converter"
Title="MainWindow" Height="350" Width="525">
<Grid>
<CheckBox IsChecked="{Binding item, Converter={converter:ValueConverterWithProperties TrueValue=5}}"></CheckBox>
<CheckBox IsChecked="{Binding item2, Converter={converter:ValueConverterWithProperties TrueValue=10}}"></CheckBox>
</Grid>
顺便说一句,这个错误是由于你在转换器中的依赖性 属性 不是静态的(并且之前在某处创建了这个转换器的实例之后)。
编辑
所以问题出在这一行:
public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
此处,依赖项 属性 MaterialsListProperty
正在注册 与此类型对象(即 LEGOMaterialConverter
)的每个实例化。
然而,依赖属性应该定义为静态的,如下所示:
public static readonly DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter));
一个静态变量只被初始化一次(并且依赖项属性 被注册)对于这个类型的所有未来的实例只有一次,这就是我们在这里所需要的。未能将依赖项 属性 声明为静态会导致上述错误。