1

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

我创建了一个 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 中进行数据绑定的首选方法,但我不确定我是否以最好的方式(也是最快的方式)执行此操作。我做了一次,然后按照食谱做了……</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. 它经常在 ListBoxes 中使用。即使您可能有 10 000 项数据,ListBox 也只会初始化 14 个 ListBoxItems 控件,因为它们对您是可见的。稍后当您开始滚动时,ListBox 将破坏或加载更多/更少。

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

于 2013-03-02T12:18:15.100 回答