IValueConverter 并绑定一个 DependencyObject
IValueConverter and binding a DependencyObject
我有一个 ComboBox
,我需要在 SelectedItem
上做一个转换器。问题是 IValueConverter
需要绑定值,但也需要一个集合。配置了 DependencyObject
但它给我一条错误消息
Object of type 'System.Windows.Data.Binding' cannot be converted to type 'System.Collections.ObjectModel.ObservableCollection`1[MyClass]'.
这是我的 IValueConverter
public class MyConverter : DependencyObject, IValueConverter
{
public static readonly DependencyProperty FoldersProperty =
DependencyProperty.Register(nameof(MyCollection), typeof(ObservableCollection<MyClass>), typeof(MyClassModelToMyClassID), new FrameworkPropertyMetadata(new ObservableCollection<MyClass>()));
public ObservableCollection<MyClass> MyCollection
{
get { return GetValue(FoldersProperty) as ObservableCollection<MyClass>; }
set { SetValue(FoldersProperty, value); }
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Amazing Convert code that uses MyCollection and Value
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Amazing ConvertBack code that uses MyCollection and Value
}
}
我是这样称呼它的:
<Page.Resources>
<converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
....
<ComboBox
ItemsSource="{Binding DataCollection}"
SelectedItem="{Binding Path=MyValue, Converter={StaticResource TaxCodeConverter}}" />
编辑:添加完整的 IValueConvert 减去 Convert 和 ConvertBack 代码
像 BindingProxy 一样,它需要 a Freezable。另外,不要将新的可观察集合传递给您的元数据。这是一个引用类型,因此该转换器的所有实例都将使用相同的实际集合实例进行初始化。
如果您 运行 遇到其他问题,请告诉我,但我已经这样做了并且能够绑定到依赖项 属性。
许多人认为更好的方法是多绑定和多值转换器。我认为使用具有描述性名称的强类型 属性 是有价值的。
public class MyConverter : Freezable, IValueConverter
{
/* omitted: Convert() and ConvertBack() */
public MyConverter()
{
// Initialize here if you need to
MyCollection = new ObservableCollection<MyClass>();
}
protected override Freezable CreateInstanceCore()
{
return new MyConverter();
}
public static readonly DependencyProperty MyCollectionProperty =
DependencyProperty.Register(nameof(MyCollection),
typeof(ObservableCollection<MyClass>), typeof(MyConverter),
new FrameworkPropertyMetadata(null));
public ObservableCollection<MyClass> MyCollection
{
get { return GetValue(MyCollectionProperty) as ObservableCollection<MyClass>; }
set { SetValue(MyCollectionProperty, value); }
}
}
XAML 用法将与您在问题中的用法相同:绑定依赖项 属性,绑定将更新 [=12= 实例的 属性 ],前提是您的页面的 DataContext 具有适当类型的 属性 名称 DataCollection
。
<Page.Resources>
<converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
我有一个 ComboBox
,我需要在 SelectedItem
上做一个转换器。问题是 IValueConverter
需要绑定值,但也需要一个集合。配置了 DependencyObject
但它给我一条错误消息
Object of type 'System.Windows.Data.Binding' cannot be converted to type 'System.Collections.ObjectModel.ObservableCollection`1[MyClass]'.
这是我的 IValueConverter
public class MyConverter : DependencyObject, IValueConverter
{
public static readonly DependencyProperty FoldersProperty =
DependencyProperty.Register(nameof(MyCollection), typeof(ObservableCollection<MyClass>), typeof(MyClassModelToMyClassID), new FrameworkPropertyMetadata(new ObservableCollection<MyClass>()));
public ObservableCollection<MyClass> MyCollection
{
get { return GetValue(FoldersProperty) as ObservableCollection<MyClass>; }
set { SetValue(FoldersProperty, value); }
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Amazing Convert code that uses MyCollection and Value
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Amazing ConvertBack code that uses MyCollection and Value
}
}
我是这样称呼它的:
<Page.Resources>
<converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
....
<ComboBox
ItemsSource="{Binding DataCollection}"
SelectedItem="{Binding Path=MyValue, Converter={StaticResource TaxCodeConverter}}" />
编辑:添加完整的 IValueConvert 减去 Convert 和 ConvertBack 代码
像 BindingProxy 一样,它需要 a Freezable。另外,不要将新的可观察集合传递给您的元数据。这是一个引用类型,因此该转换器的所有实例都将使用相同的实际集合实例进行初始化。
如果您 运行 遇到其他问题,请告诉我,但我已经这样做了并且能够绑定到依赖项 属性。
许多人认为更好的方法是多绑定和多值转换器。我认为使用具有描述性名称的强类型 属性 是有价值的。
public class MyConverter : Freezable, IValueConverter
{
/* omitted: Convert() and ConvertBack() */
public MyConverter()
{
// Initialize here if you need to
MyCollection = new ObservableCollection<MyClass>();
}
protected override Freezable CreateInstanceCore()
{
return new MyConverter();
}
public static readonly DependencyProperty MyCollectionProperty =
DependencyProperty.Register(nameof(MyCollection),
typeof(ObservableCollection<MyClass>), typeof(MyConverter),
new FrameworkPropertyMetadata(null));
public ObservableCollection<MyClass> MyCollection
{
get { return GetValue(MyCollectionProperty) as ObservableCollection<MyClass>; }
set { SetValue(MyCollectionProperty, value); }
}
}
XAML 用法将与您在问题中的用法相同:绑定依赖项 属性,绑定将更新 [=12= 实例的 属性 ],前提是您的页面的 DataContext 具有适当类型的 属性 名称 DataCollection
。
<Page.Resources>
<converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>