1

我想在我们创建的从 ListView 派生的控件中禁用列重新排序。此控件称为SortableListView. 我认为依赖属性将是实现这一点的最佳方式,但((SortableListVIew)source).View正在返回null. 这是代码:

public class SortableListView : ListView
{
    // ...lots of other properties here

    public static readonly DependencyProperty AllowsColumnReorderProperty =
        DependencyProperty.Register(
          "AllowsColumnReorder", 
          typeof(bool), 
          typeof(SortableListView), 
          new UIPropertyMetadata(true, AllowsColumnReorderPropertyChanged));

    public bool AllowsColumnReorder
    {
        get
        {
            return (bool)this.GetValue(AllowsColumnReorderProperty);
        }

        set
        {
            this.SetValue(AllowsColumnReorderProperty, value);
        }
    }

    private static void AllowsColumnReorderPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        ViewBase vb = ((SortableListView)source).View;

        if (vb != null)
        {
            ((GridView)vb).AllowsColumnReorder = (bool)e.NewValue;  
        }
    }

和 XAML:

    <TableControls:SortableListView x:Name="QueueViewTable" Margin="0,0,0,0"
                                      Style="{StaticResource ListViewStyle}"
                                      ItemsSource="{Binding Path=QueueList}"
                                      ItemContainerStyle="{StaticResource alternatingListViewItemStyle}"
                                      AlternationCount="2"
                                      SelectionMode="Single"
                                      SortEnabled="False"
                                      AllowsColumnReorder="false">

问题在于 vb 始终为空,因此该方法无法设置 AllowsColumnReoder。我很确定强制转换是有效的,因为代码在 OnInitialized 中最初看起来像这样:

    ((GridView)this.View).AllowsColumnReorder = false;

...但我需要在视图的特定实例上设置 AllowsColumnReorder,所以这段代码不好。

谁能告诉我我做错了什么?或者有没有更好的方法来设置这个属性?

4

1 回答 1

0

View属性ListView本身就是一个可以改变的依赖属性。设置属性时似乎尚未设置?

您可能必须View在可排序列表视图中覆盖该属性,因此您可以添加一个属性更改侦听器,然后在设置视图本身时应用您的排序属性?

在 wpf 中,您可以覆盖在父类中声明的依赖属性,如下所示:http: //msdn.microsoft.com/en-us/library/ms754209.aspx

您将覆盖该View属性的元数据,并在PropertyMetadata您在那里设置的参数中,您可以像上面一样传递一个函数AllowsColumnReorderPropertyChanged

在该处理程序中,您将检查新视图是否为网格视图,然后设置您的属性。

这样,无论是顺序AllowsColumnReorder还是View设置都将正确设置您的属性。

于 2013-08-30T16:43:30.650 回答