WPF UserControl数据绑定性能

时间:2013-03-01 23:11:25

标签: wpf data-binding wpf-controls dependency-properties

我希望有人可以帮我解决这个问题:

我创建了一个WPF用户控件(称之为MainControl),它使用了一些其他用户控件(UserControlA和UserControlB)。这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中进行数据绑定的首选方法,但我不确定我是否以最佳方式(最快)进行此操作。我做了一次,然后按照食谱......

2 - 在某些情况下,我希望根本不使用UserControlB。我使它不可见但是当ViewModel中的DP更新时,控件中的绑定和其他所有内容仍在执行。是否有一种简单而无痛的方法来禁用DP或整个控件,这样我就可以消除开销? (this.Disable = true;不要这样做)。我希望UserControlB DP的行为与它们不存在一样......

1 个答案:

答案 0 :(得分: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>

在这个例子中,ListView的内部控件名为ListViewItems(后面会显示填充数据并在不同列中分隔的行)以可视树的形式绑定,以确定用户设置的列。

2)如果您不想使用它并且您不希望在折叠时更新绑定,那么为什么要让efford初始化它。控件的折叠状态意味着它不可见,但如果您希望在某个特定时间点显示控件,仍会收到更新。有了更新,我的意思是绑定到数据,宽度和高度以及其他必要的信息。

在开始时不要初始化控件,但是在需要时将一个新的intialalized实例注入StackPanel。它被称为UI Virtualization。它经常在ListBoxes中使用。即使您可能有10000个数据项,ListBox也只会初始化14个ListBoxItems控件,因为这些控件是可见的。稍后当您开始滚动时,ListBox将会破坏或加载更多/更少。

PS:如果要提高性能,请首先使用性能分析器测量应用程序的行为。也许你不需要改进任何东西。或许你需要买一台新电脑。谁知道,剖析器呢。 :PP