0

WPF 中是否有一个“控件”,它充当单个绑定数据的无操作、无显示存储库?基本上,一个不可见的控件只公开一个“标签”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>

这样的控件还可以让我在单个视图中“展平”一个复杂且深度嵌套的 ViewModel 结构。在生成用户界面模型时,我还可以将它用作占位符,但我还没有生成 ViewModel。

另一个理想的使用场景是创建一次性“IValueConverter”类的替代方案。举个例子:与其尝试通过 IValueConverter 过滤数据绑定值,为了获得结果“不透明度”,我可以只使用 DataTriggers 对 StorageControl 进行“样式化”以呈现正确的值:

<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吗?

4

1 回答 1

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并且绑定仍然有效,您还可以使用简单的ContentPresenter/ ContentControl,折叠,并使用它们的Content属性具有“标签”。当我真的很匆忙时,我使用了几次这个技巧。

但是,请注意,这不是一个可行的方法。它会让一些事情变得更容易,但最终你会在一些课程上采用幼稚的 WinForms 方式教授,由于许多问题,每个人都努力避免这些课程。

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

Lookless 控件+样式允许您编写一次绑定并重用样式。

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

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

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

编辑:

我设法找到的“复合样式”的注释/链接:

于 2014-06-02T15:14:17.280 回答