【问题标题】:WPF Template Binding with more than 1 content具有超过 1 个内容的 WPF 模板绑定
【发布时间】:2015-04-09 09:31:11
【问题描述】:

所以,我有这个窗口。在它上面,我正在成对创建一个 TextBlocks 和 TextBoxes 的列表。当您单击其中任何一个时,它们都会在相应的 TextBox 中输入一个数字,并在后台设置一些值。现在一切正常。

我有以下 XAML 来创建自定义复选框(因为它具有我想用于此目的的行为)。我的问题是我想将不同的内容绑定到 TextBlock 和 TextBox 中。对于 TextBlock,我绑定了 Content 属性,但找不到合适的选项来满足第二个绑定。我考虑将它放在标签中,但这感觉不对,而且无论如何,我已经将我需要的索引值绑定到那里。

<Style x:Key="CustomCHK" TargetType="{x:Type CheckBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <DockPanel LastChildFill="True">
                        <TextBox DockPanel.Dock="Right" Width="50" Height="30" />
                        <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

感觉应该有一个简单的解决方案,但我只是想决定什么是最好的。我是否要创建一个自定义复选框类并只添加几个属性?

与往常一样,我很感激你能给我提供的任何方向。

【问题讨论】:

  • 您想绑定到文本框的第二个值是多少?它是用户输入吗?但是假设文本框是用户输入,我认为对于您的情况,为复选框添加自定义控件并向其添加新属性会更合适。
  • @Sypher_04 您所拥有的看起来更像UserControl 或自定义控件,您可以在其中创建自己的依赖项属性。或者,如果您仍想使用CheckBox,您可以创建附加属性
  • 有点像我的想法。基本上我有一个收集所有用户输入的背景对象。最初,所有文本框都是空白的。绑定到空字符串值。收到输入后,如果用户返回此屏幕,他们的输入将通过背景对象上的绑定重新加载到屏幕上。
  • @Sypher_04 是否有任何特殊原因使您模板化CheckBox 控件?这是您想要的行为(可以在两种状态之间切换的控件)吗?或者你只是因为它有一个通用的Content 属性而使用它?

标签: c# wpf xaml


【解决方案1】:

不幸的是,没有直接的方法可以做到这一点。我只能看到两个(有些缺陷的)解决方法:

  • 子类CheckBox 以满足您的需要,并添加您需要的其他内容属性。优点是这将完全启用 IDE 的编程帮助来设置内容属性,并且这些属性将是类型安全的。缺点是您需要添加 C# 代码,其唯一目的是声明额外的内容属性(即不添加任何“行为逻辑”),这似乎与“干净的”仅用于演示的 XAML 方法相冲突。
  • 您可以尝试将一个数组传递给Content property,然后在您的控件模板中放置几个​​ContentPresenter 实例,每个实例都绑定到数组中的另一个项。 Binding property paths should support indexed access,尽管您的代码可能会变得有点冗长,因为 XAML 中的数组必须使用 x:Array markup extension 显式编写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多