WPF简单的“数据存储”控制

时间:2014-06-02 14:51:48

标签: wpf binding frameworkelement

是否有"控制"在WPF中,它作为一个无用的,无显示的存储库,用于单个绑定数据?基本上,一个看不见的控件,只暴露一个" Tag"的DependencyProperty。

我想使用这样的控件来巩固我经常使用的一些'数据绑定到单个位置。如果我稍后更改ViewModel属性的名称,我只需要在一个地方更新绑定;我的标签'控制。

例如:

<!-- Does this type of control exist? -->
<StorageControl x:Name="someData" Tag="{Binding MyProperty}" />
<StorageControl x:Name="moreData" Tag="{Binding MyOtherProperty}" />

<!-- further down the XAML file... -->
<TextBlock Text="{Binding Tag, ElementName=someData}">
    <Image.Style> 
        <!-- Style makes reference to "someData" and "moreData," -->
        <!-- with data triggers effecting the appearance. -->
    </Image.Style>
</TextBlock>
<Image>
    <Image.Style> 
        <!-- Style makes reference to "someData" and "moreData," -->
        <!-- with data triggers effecting the appearance. -->
    </Image.Style>
</Image>

这样的控制也可以让我“变平”&#39;一个View中另一个复杂且深度嵌套的ViewModel结构。我还可以在删除用户界面模型时将其用作占位符,但我还没有生成ViewModel。

另一种理想的使用方案是作为创建一次性使用的IValueConverter&#34;的替代方案。类。作为一个例子:不是试图通过IValueConverter来过滤数据绑定值,而是为了获得结果&#34; Opacity,&#34;我可以'风格'&#39; StorageControl使用DataTriggers显示正确的值:

<StorageControl x:Name="opacityHost">
    <StorageControl.Style>
        <Style TargetType="StorageControl">
            <Setter Property="Tag" Value="1.0" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding MyProperty}">
                    <!-- This opacity trigger can now be used -->
                    <!-- by many other controls, without overriding their style -->
                    <Setter Property="Tag" Value="0.5" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StorageControl.Style>
</StorageControl>

我意识到我可以制作自己的,但这似乎是一个通用的控制,它可能已经存在。

我会在这种情况下使用FrameworkElement吗?

1 个答案:

答案 0 :(得分:0)

据我记忆,这种控制不存在,但您可以轻松编写。它实际上包括:

class MyDataHolder : Control
{
    // now add here one DependencyProperty that DONT have "AffectsXYZ" flags
    // or many DepProps if you want to 'gather' more things in one place
}

实际上,考虑到您始终可以设置Visible=Collapsed并且Binding仍然有效,您也可以使用简单的ContentPresenter / ContentControl,折叠并使用他们的Content属性“标签”。当我真的赶时间的时候,我曾经多次使用过这个技巧。

然而,请注意,这不是一种方法。它会使一些事情变得更容易,但是你会在一些每个人都努力避免由于许多问题而避免的课程中使用WinForms的方式。

如果仔细检查“Control + DP”方式,您将学习如何制作更好的“无视控制”的技巧。此外,如果您考虑更多,最终将剥离“DP”和“控制”部分,您将“发现”ViewModel,这将使您能够测试您的UI行为。

Lookless控件+样式允许您编写一次Biindings并重复使用该样式。

“复合样式”(在网上搜索!关键字:复合,合并,复合等)允许您将多种样式应用于同一控件,当然也有一些限制。

最后,如果想要添加AttachedDependencyProperty的所有内容,请搜索“行为”的概念,这将允许您通过XAML注入任意代码。这将允许您编写相对简单的扫描仪/观察器,它们将通过可视树并自动应用任何自定义样式,绑定等。

虽然没有免费 - 其中一些最终会出现在更复杂的代码中。应用于同一控件的2或5个行为之间的调试冲突可能会令人难以忘怀。

编辑:

注释/指向“复合风格”的链接我找到了: