1

誰かがこれで私を助けてくれることを願っています:

他のいくつかのユーザー コントロール (UserControlA と UserControlB) を使用する WPF ユーザー コントロール (MainControl と呼びます) を作成しました。これら 2 つのユーザー コントロールは、MainControl.xaml.cs クラス (MainControlDependencyProperty1 から 3) で作成された依存関係プロパティにバインドします。これらの DP (多くの場合) は、ViewModel から DP にバインドされます。次のコードはこれを示しています。

<StackPanel>

    <doesntmatter:UserControlA
        Property1="{Binding Path=MainControlProperty1, RelativeSource={RelativeSource AncestorType={x:Type views:MainControl}, Mode=FindAncestor}, Mode=OneWay}"
        Property2="{Binding Path=MainControlProperty2, RelativeSource={RelativeSource AncestorType={x:Type views:MainControl}, Mode=FindAncestor}, Mode=TwoWay}"
    />

    <doesntmatter:UserControlB
        Property2="{Binding Path=MainControlProperty2, RelativeSource={RelativeSource AncestorType={x:Type views:MainControl}, Mode=FindAncestor}, Mode=TwoWay}"
        Property3="{Binding Path=MainControlProperty3, RelativeSource={RelativeSource AncestorType={x:Type views:MainControl}, Mode=FindAncestor}, Mode=TwoWay}"
    />

</StackPanel>

これにより、アプリケーションのさまざまな部分で再利用できる自己完結型のコントロールができました。それを AXML にドラッグし、適切な DP をバインドするだけで問題ありません (データは保存しません)。UserControlsA と B は、他のいくつかの場所でも MainControl とは別に使用されます。すべて正常に動作していますが、パフォーマンスを改善したいので、いくつか質問があります。

1 – UserControlsA と B を MainControl にバインドする適切な方法ですか? ViewModel から完全に独立させたいのです。DP が WPF でデータ バインディングを行うための最適な方法であることは知っていますが、これを可能な限り最善の方法 (かつ最速) で行っているかどうかはわかりません。私は一度それを機能させ、レシピに従いました…</p>

2 – UserControlB をまったく使用したくない状況があります。非表示にしますが、ViewModel の DP が更新されても、コントロール内のバインディングとその他すべてが実行されます。オーバーヘッドを排除できるように、DP またはコントロール全体を無効にする簡単で簡単な方法はありますか? (this.Disable=true; しないでください)。UserControlB DP が存在しないかのように動作するようにしたい…</p>

4

1 に答える 1

0

1) はい、VisualTree 内で要素をバインドする適切な方法です。これは、Microsoft から直接提供された例です。ListView をグーグルで検索すると、次の MSDN リンクが見つかります。

<Style TargetType="ListViewItem">
    <!-- ListBox has a property called GridView and GridView is futhermore a class that has a property called Columns -->
    <!-- Within this setter you search your way up the visual tree till you find the colums of GridView. Then you bind those columns to yours -->
    <Setter Property="Columns" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=GridView.Columns}"
    ...
</Style>

この例では、ListViewItems と呼ばれる ListView の内部コントロール (後で、データで満たされた行を別の列に分けて表示します) は、ビジュアル ツリーを上方向にバインドして、ユーザーが設定した列を把握します。

2)それを使用したくない場合、および折りたたまれている間にバインディングを更新したくない場合は、なぜそれを初期化する努力をするのですか。コントロールの折りたたまれた状態は表示されないことを意味しますが、特定の時点でコントロールを表示したい場合に備えて、更新は引き続き受信されます。更新とは、データへのバインディング、幅と高さ、およびその他の必要な情報を意味します。

最初にコントロールを初期化しないでください。必要に応じて、新しく初期化されたインスタンスを StackPanel に挿入します。と呼ばれUI Virtualizationます。また、ListBox 内で頻繁に使用されます。10,000 項目のデータがある場合でも、ListBox は 14 の ListBoxItems コントロールしか初期化しません。後でスクロールを開始すると、ListBox は破棄されるか、ロードされる量が増えたり減ったりします。

PS: パフォーマンスを向上させたい場合は、まずパフォーマンス プロファイラーを使用してアプリケーションの動作を測定します。たぶん、何も改善する必要はありません。または、新しいコンピューターを購入する必要があるかもしれません。誰が知っているか、プロファイラーはそうします。:PP

于 2013-03-02T12:18:15.100 に答える