Wpf 元素绑定到折叠的UserControl是一个草率、廉价的把戏吗?

Wpf 元素绑定到折叠的UserControl是一个草率、廉价的把戏吗?,wpf,xaml,Wpf,Xaml,我相信我们大多数人都会同意,从父上下文或自上下文中用完声明性DataContext源是可能的。然后,我们可以求助于绑定到父标记,然后使用元素绑定。因此,源代码可能如下所示: <Grid.Tag> <Binding Path="MyProperty" Source="{StaticResource MySource}" /> </Grid.Tag> <Control x:Name="Whatever" DataContext="..." />

我相信我们大多数人都会同意,从父上下文或自上下文中用完声明性
DataContext
源是可能的。然后,我们可以求助于绑定到父
标记
,然后使用元素绑定。因此,源代码可能如下所示:

<Grid.Tag>
    <Binding Path="MyProperty" Source="{StaticResource MySource}" />
</Grid.Tag>
<Control x:Name="Whatever" DataContext="..." />
<Control x:Name="SomethingElse" DataContext="..." />
Text="{Binding DefaultFontSize,Source={x:Static ApplicationProperties.Instance}}"
现在我可以做到:

<Grid.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="{Binding CrazyForegroundColor, ElementName=MySloppyControl}" />
    </Style>
</Grid.Resources>


假设我充分解释了这一点,那么这个崩溃的
UserControl
模式是否被误导了?

不是因为我自己没有做过,而是我必须说“是”——这个模式被误导了

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

<Grid.Tag>
    <Binding Path="MyProperty" Source="{StaticResource MySource}" />
</Grid.Tag>
<Control x:Name="Whatever" DataContext="..." />
<Control x:Name="SomethingElse" DataContext="..." />
Text="{Binding DefaultFontSize,Source={x:Static ApplicationProperties.Instance}}"
还是这个

Text="{Binding PropertyName,Source={StaticResource ResourceContainingProperty}}"
如果您的动机是避免创建viewmodel来组合多个模型对象,请使用C#Anonymousut类型来构建穷人的viewmodel。例如:

DataContext = new { something = 123, whatever = "Test" };
另一种常见模式是在控件上创建属性,并使用ControlTemplate和TemplateBinding绑定到它们


这就剩下了最后一种情况,即您确实需要一个共享值,并且不希望任何代码落后。在本例中,我实际使用了不可见的
,如前所示。因此,很少有情况会用到它。

您能举一个“声明性数据上下文源用完”的例子吗?我似乎不明白这一点。让我们忘掉“用完”的
DataContext
,因为你的问题(对我)暗示你从未遇到过这个问题。(对您来说)一个更有用的问题是,“您是否曾出于任何原因在XAML中使用过
UserControl
元素?”顺便说一句,这个问题并不是问您是否基于
UserControl
构建了自定义类型——我指的是在XAML代码中编写
UserControl