gpt4 book ai didi

wpf - IValueConverter 上的数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 06:50:13 26 4
gpt4 key购买 nike

有谁知道是否可以对基于 IValueConverter 的类进行数据绑定(bind)?

我有以下转换器:

[ValueConversion(typeof(int), typeof(Article))]
public class LookupArticleConverter : FrameworkElement, IValueConverter {
public static readonly DependencyProperty ArticlesProperty = DependencyProperty.Register("Articles", typeof(IEnumerable<Article>), typeof(LookupArticleConverter));

public IEnumerable<Article> Articles
{
get { return (IEnumerable<Article>)GetValue(ArticlesProperty); }
set { SetValue(ArticlesProperty, value); }
}

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
...
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
...
}
}

其目的是通过其 Id 在列表中查找文章,并返回该文章。

但是,我想通过将集合数据绑定(bind)到它来填充 Articles 属性,如下所示:
<local:LookupArticleConverter Articles="{Binding Articles}" x:Key="LookupArticle"/>

但这似乎不起作用。永远不会调用 setter 方法。 source 属性包含一个实际的非空集合,所以这不是问题。

输出日志中也没有关于绑定(bind)的错误消息。

有什么线索吗?

最佳答案

所以,问题在于资源不是可视化树的一部分。要完成这项工作,您必须:

1.让你的ValueConverter继承Freezable

 public class CustomConverter : Freezable, IValueConverter
{

public static readonly DependencyProperty LookupItemsProperty =
DependencyProperty.Register("LookupItems", typeof(IEnumerable<LookupItem>), typeof(CustomConverter), new PropertyMetadata(default(IEnumerable<LookupItem>)));

public IEnumerable<LookupItem> LookupItems
{
get { return (IEnumerable<LookupItem>)GetValue(LookupItemsProperty); }
set { SetValue(LookupItemsProperty, value); }
}

#region Overrides of Freezable

/// <summary>
/// When implemented in a derived class, creates a new instance of the <see cref="T:System.Windows.Freezable"/> derived class.
/// </summary>
/// <returns>
/// The new instance.
/// </returns>
protected override Freezable CreateInstanceCore()
{
return new CustomConverter();
}

#endregion Overrides of Freezable

// ... Usual IValueConverter stuff ...

}

2. 使用 Binding ElementName 绑定(bind)到可视化树
<UserControl (...) x:Name=myUserControl> 
<UserControl.Resources>
<CustomConverter x:Key="customConverter"
LookupItems="{Binding ElementName=myUserControl, Path=DataContext.LookupItems}"/>
</UserControl.Resources>

关于wpf - IValueConverter 上的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/625535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com