gpt4 book ai didi

wpf - 将元素绑定(bind)到折叠的用户控件是一种草率、廉价的技巧吗?

转载 作者:行者123 更新时间:2023-12-04 06:57:30 24 4
gpt4 key购买 nike

我相信我们大多数人都会同意声明性 DataContext 可能用完。来自 parent 或自己的背景。然后我们可能会求助于绑定(bind)到父 Tag然后使用元素绑定(bind)。所以源代码可能如下所示:

<Grid.Tag>
<Binding Path="MyProperty" Source="{StaticResource MySource}" />
</Grid.Tag>

当我们甚至不能做到这一点时会发生什么?我的下一个马虎技巧是使用折叠的 UserControl元素:
<UserControl
x:Name="MySloppyControl"
DataContext="{StaticResource YetAnotherSourceInThisCrazyGrid}"
Foreground={Binding CrazyForegroundColor}
Visibility="Collapsed" />

现在我可以这样做了:
<Grid.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Foreground" Value="{Binding CrazyForegroundColor, ElementName=MySloppyControl}" />
</Style>
</Grid.Resources>

假设我对此进行了充分解释,这是否已崩溃 UserControl模式被误导了?

最佳答案

并不是说我自己没有做过,而是我不得不说"is"——这种模式被误导了。

在我选择这样做的少数情况下,我的代码如下所示:

<Control x:Name="Whatever" DataContext="..." />
<Control x:Name="SomethingElse" DataContext="..." />

由于默认情况下控件是不可见的,因此可以用更少的代码实现相同的效果。

话虽如此,让我解释一下为什么我认为这种方法是错误的:

WPF 是关于绑定(bind)到数据的。如果你有一些数据要绑定(bind),它要么是模型(或 View 模型)的一部分,要么是外部的。如果它是您的模型(或 View 模型)的一部分,并且您的模型结构定义明确,您应该能够通过当前 DataContext 访问它。另一方面,如果它是静态的,您应该能够直接从目标访问它。

例如,假设您要使用模型中所有可能的 WidgetType 填充 ComboBox。如果您的模型构造良好,则绑定(bind)可以很简单:
<ComboBox ItemsSource="{Binding DataSet.AllWidgetTypes}" />

这假定您的 ComboBox 的 DataContext 是一个“Widget”,并且“Widget”具有一个“DataSet”属性,可以访问其他相关数据。或者,如果可用类型列表可能会根据 Widget 的其他详细信息而更改,则绑定(bind)可能只是 {Binding AppliableWidgetTypes} .

您可能需要一个“单独的 DataContext”的另一种情况是引用静态对象时,例如通过 x:Static 或 StaticResource。在这些情况下,有更好的方法:设置 Binding.Source .它看起来像这样:
Text="{Binding DefaultFontSize,Source={x:Static ApplicationProperties.Instance}}"

或这个
Text="{Binding PropertyName,Source={StaticResource ResourceContainingProperty}}"

如果您的动机是避免创建 View 模型来组合多个模型对象,请使用 C# 匿名类型来构造穷人的 View 模型。例如:
DataContext = new { something = 123, whatever = "Test" };

另一种常见模式是在控件上创建属性并使用 ControlTemplate 和 TemplateBinding 绑定(bind)到它们。

这留下了最后一种情况,即当你真的想要一个共享值并且你根本不想要代码隐藏时。在这种情况下,我实际上已经使用了不可见的 <Control>如前所示。因此,在极少数情况下它可能适用。

关于wpf - 将元素绑定(bind)到折叠的用户控件是一种草率、廉价的技巧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com