【问题标题】:Binding custom Dependency Property to ListView width not updating将自定义依赖属性绑定到 ListView 宽度不更新
【发布时间】:2016-01-11 19:54:20
【问题描述】:

我有一个名为 CategoryToGridViewConverterIValueConverter,它有一个名为 ListViewWidthProperty 的 DependencyProperty。我还从DependencyObject 继承了我的转换器,以便它可以与 DependencyProperties 一起使用。这是我的转换器的定义方式:

internal class CategoryToGridViewConverter : DependencyObject, IValueConverter
    {
        public static readonly DependencyProperty ListViewWidthProperty = DependencyProperty.Register("ListViewWidth", typeof (double),
                                                                                                      typeof (CategoryToGridViewConverter), new PropertyMetadata(0d, PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            Debug.WriteLine("ListViewWidth: " + dependencyPropertyChangedEventArgs.NewValue);
        }

        public double ListViewWidth {
            get { return (double)GetValue(ListViewWidthProperty); }
            set { SetValue(ListViewWidthProperty, value); }
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //Not relevant
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //Not relevant
        }
    }
}

很简单。然后我在 XAML(在 ListView 资源部分)中创建这个转换器,如下所示:

<ListView Grid.Row="0" BorderThickness="0"
          ItemsSource="{Binding SelectedCategory.Entries}"
          x:Name="listView"
          SizeChanged="ListView_OnSizeChanged">
    <ListView.Resources>
        <local:CategoryToGridViewConverter x:Key="CategoryToGridViewConverter" ListViewWidth="{Binding listView, Path=Width, Mode=OneWay}"/>
    </ListView.Resources>
    <ListView.View>
        <Binding Path="SelectedCategory" Converter="{StaticResource CategoryToGridViewConverter}"/>
    </ListView.View>
</ListView>

但问题是ListViewWidth 永远不会更新。它始终保持在 0。但有问题的 ListView 显然没有 0 宽度。

我做错了什么?

编辑:它还在输出屏幕上给出了绑定错误:

System.Windows.Data 错误:2:找不到管理 FrameworkElement 或 FrameworkContentElement 为目标元素。 绑定表达式:路径=宽度;数据项=空;目标元素是 'CategoryToGridViewConverter' (HashCode=33594544);目标属性是 'ListViewWidth'(输入'Double')

DependencyProperties 是否仅适用于 FrameworkElements?如果是这样,我的转换器如何知道 ListView 的宽度?

【问题讨论】:

  • 据我所知,DependencyProperty 只能在 DependencyObject 中声明。例如,这是给你SetValueGetValue 的类。如果您只有CategoryToGridViewConverterIValueConverter 接口,我真的不明白这是如何编译的。您能否通过转换器的完整实施更新您的答案?
  • 我已经更新了我的问题
  • 谢谢,能否请您也插入转换器的用法?我可以看到您将其放入 Resources 集合或 ResourceDictionary,但您想在哪里使用它?
  • 我又更新了。 :)

标签: wpf data-binding dependency-properties


【解决方案1】:

我认为您可以只使用多值转换器。

<local:CategoryToGridViewMultiConverter x:Key="CategoryToGridViewConverter" />

转换器:

public class CategoryToGridViewMultiConverter: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var category = (Category)values[0]; // Assumption: you're using a class named Category
        var listViewWidth = (double)values[1];

        // same logic you had before
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用法:

<ListView.View>
    <MultiBinding Converter="{StaticResource CategoryToGridViewConverter}">
        <Binding Path="SelectedCategory" />
        <Binding ElementName="listView" Path="Width" Mode="OneWay" />
    </MultiBinding>
</ListView.View>

【讨论】:

  • 非常感谢。这行得通。你知道为什么其他方法不起作用吗?
  • 我认为,这是因为转换器不是视觉或逻辑树的一部分,ResourceDictionary 中的绑定不知道使用哪个FrameworkElementDataContext 来评估绑定反对。如此处所述:thomaslevesque.com/2011/03/21/…
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多