2013-03-01 98 views
1

我希望有人能幫助我這一個:WPF用戶控件數據綁定性能

我創建了一個WPF用戶控件(稱之爲MainControl)使用一對夫婦的其他用戶控件(UserControlA和UserControlB)的。這兩個用戶控件綁定到在我的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中進行數據綁定的首選方法,但我不確定是否以最好的方式(和最快)執行此操作。我做了一次,並遵循配方...

2 - 有些情況下我不想使用UserControlB。我使它不可見,但當ViewModel中的DP更新時,控件中的綁定和其他所有內容仍在執行中。有沒有一種簡單和無痛的方式來禁用DP或整個控制,所以我可以消除開銷? (this.Disable = true;不要這樣做)。我想UserControlB DP的表現就像它們不存在一樣...

回答

0

1)是它的正確方法將您的元素綁定在VisualTree內部。這裏是直接來自微軟的例子。如果谷歌的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> 

在這個例子中的ListView稱爲ListViewItems的內對照(後來本的行填充數據和在不同的列中分離)結合它的方式可視化樹來確定用戶設置了哪些列。

2)如果你不想使用它,並且你不想讓綁定在崩潰時被更新,那麼爲什麼要讓這個綁定完全消失。控件的摺疊狀態意味着它不可見,但如果您希望在某個特定時間點顯示控件,則仍然會收到更新。更新意味着綁定到數據,寬度和高度以及其他必要的信息。

只需在開始時不要初始化控件,但需要時將它的新實例注入StackPanel。它叫UI Virtualization。它經常在ListBoxes中使用。即使您可能有10000個數據項,ListBox也只會初始化14個ListBoxItems控件,因爲這些控件對您來說是可見的。稍後當您開始滾動時,ListBox將會更多/更少地刪除或加載。

PS:如果您想提高性能,請首先使用性能分析器測量應用程序的行爲。也許你不需要改善任何事情。或者,也許你需要購買一臺新電腦。誰知道,剖析器呢。 :PP