将自定义依赖项 属性 绑定到 ListView 宽度未更新

Binding custom Dependency Property to ListView width not updating

我有一个名为 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 Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Width; DataItem=null; target element is 'CategoryToGridViewConverter' (HashCode=33594544); target property is 'ListViewWidth' (type 'Double')

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

我想你可以使用 multi-value 转换器。

<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>