1

ListView から派生した、作成したコントロールで列の並べ替えを無効にしたいと思います。このコントロールは と呼ばれSortableListViewます。これを実装するには依存関係プロパティが最適な方法だと思いましたが((SortableListVIew)source).Viewnull. コードは次のとおりです。

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 が常に null であるため、メソッドが EnabledColumnReoder の設定に失敗することです。コードはもともと OnInitialized で次のように見えたため、キャストが有効であることは確かです。

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

...しかし、ビューの特定のインスタンスに allowColumnReorder を設定する必要があるため、このコードは役に立ちません。

誰が私が間違っているのか教えてもらえますか? または、このプロパティを設定するより良い方法はありますか?

4

1 に答える 1

0

Viewプロパティは、ListViewそれ自体が変更可能な依存関係プロパティです。プロパティを設定しているときに、まだ設定されていないように見えますか?

View並べ替え可能なリストビューでプロパティをオーバーライドする必要がある場合があるため、プロパティ変更リスナーを追加して、ビュー自体が設定されたときに並べ替えプロパティを適用できますか?

wpf では、ここに示すように、親クラスで宣言された依存関係プロパティをオーバーライドできます

Viewプロパティのメタデータをオーバーライドし、PropertyMetadataそこに設定したパラメーターで、上記のような関数を渡すことができますAllowsColumnReorderPropertyChanged

そのハンドラーで、新しいビューがグリッドビューかどうかを確認してから、プロパティを設定します。

そうすれば、順序AllowsColumnReorderまたは設定のいずれかによってView、プロパティが適切に設定されます。

于 2013-08-30T16:43:30.650 に答える