【问题标题】:WPF Custom control property set via XAML in own tag通过 XAML 在自己的标记中设置 WPF 自定义控件属性
【发布时间】:2015-07-07 18:15:12
【问题描述】:

我正在构建一个 WPF 控件,它将在显示模式下显示一个组件,然后单击,将切换到一个在编辑模式下的组件。

这两个组件将被绑定,以便编辑值反映在显示组件(通常是 TextBlock)上。

我想要的 XAML 语法如下。

     <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="Rating Year">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Controls:EditableControlContainer>
                                <Controls:EditableControlContainer.DisplayControl>
                                    <TextBlock Text="{Binding ValueString}" />
                                </Controls:EditableControlContainer.DisplayControl>
                            </Controls:EditableControlContainer>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
        </ListView.View>

背后的代码

 public partial class EditableControlContainer : UserControl
 {
    private UserControl displayControl;

    public UserControl DisplayControl {
        get { return displayControl; }
        set { displayControl = value; }
    }

    private UserControl editControl;

    public UserControl EditControl {
        get { return editControl; }
        set { editControl = value; }
    }


    public EditableControlContainer() {
        InitializeComponent();
    }
}

我得到的错误是 EditableControlContainer.DisplayControl 无法识别或无法访问。

我也不确定我是否可以包含一个对象或类型 UserControl(最好我想使用一个接口,虽然我不确定是哪一个)。

谁能解释或提供一个资源链接来演示如何在 XAML 中使 UserControl 中的属性可配置?

我浏览了论坛,但找不到任何内容。

非常感谢。

【问题讨论】:

  • 这是导致代码无法编译的实际错误,还是只是 XAML 编辑器中的波浪形下划线指示符?
  • 这导致代码无法编译,但重启VS后,现在只是显示一个错误,指出该属性不支持TextBlock
  • 我也做了一些测试,在重新启动 VS 之前我遇到了完全相同的错误。我想知道 VS 和引用有什么问题。
  • 我在对 Using 语句进行了大量更改时遇到了类似的问题。有时,VS 在重新启动之前不会解析任何包。这似乎是 VS 中的一个怪癖,但这是我第一次在 XAML 中配置自定义控件时遇到它。
  • 作为进一步考虑,我已将类型从 UserControl 更改为 UIElement,并且再次需要重新启动 VS 以清除 XAML 中的错误。希望这会在某个时候在 VS 的更新中得到解决。

标签: c# wpf


【解决方案1】:

TextBlock 不是 UserControl,如果要在其中放置 TextBlock,则需要将显示控件的类型更改为 TextBlock。

private TextBlock displayControl;

public TextBlock DisplayControl {
    get { return displayControl; }
    set { displayControl = value; }
}

【讨论】:

  • 谢谢,我希望这可能是一种更通用的方法,但我现在只需要支持 TextBlock。
  • 您很可能将 UIElement 或 FrameworkElement 作为类型,这会使它更加通用。另一个想法是让它成为一个 StackPanel,这样你就可以适应任何你想要的东西。
  • 我将同时试验 FrameworkElement 和 UIElement。我不愿意使用 StackPanel,因为我希望组件能够一致地调整大小。过去我发现堆栈面板在调整大小方面有点挑剔。
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多