将自定义依赖项 属性 绑定到 ListView 宽度未更新
Binding custom Dependency Property to ListView width not updating
我有一个名为 CategoryToGridViewConverter
的 IValueConverter
,它有一个名为 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>
我有一个名为 CategoryToGridViewConverter
的 IValueConverter
,它有一个名为 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>