【问题标题】:Is it appropriate to cast ContentPresenter.Content to UIElement?将 ContentPresenter.Content 转换为 UIElement 是否合适?
【发布时间】:2009-12-01 05:39:18
【问题描述】:

在任何情况下ContentPresenter 的内容将是UIElement 以外的某个对象?鉴于该字段被声明为对象而不是UIElement,似乎有可能。但是,我想不出它会是什么情况,或者即使它是有效的。

ContentPresenter presenter = GetTemplateChild(PART_Presenter) as ContentPresenter;
UIElement myElement = (UIElement)presenter.Content;
myElement.SomeUIMethod(); // possible InvalidOperationException?

【问题讨论】:

  • 第二行会出现 InvalidCastException,第三行不会出现 InvalidOperationException

标签: c# wpf contentpresenter uielement


【解决方案1】:

我一直这样做——整个 MVVM 方法是建立在非UIElement 内容上的,这里有一个例子:

创建一个不是从UIElement 派生的类,在本例中我将其称为 MyViewModelClass。

创建一个窗口并添加此代码

public partial class Window1 : Window
{
    public Window1()
    {
        DataContext = new MyViewModelClass();
        InitializeComponent();
    } 
}

并向 XAML 添加一些内容控件:

<Button Content="{Binding}"/>

现在您有一个 ContentPresenter(在 Button 控件模板内),其中 MyViewModelClass 作为内容。

另一个(可能更常见的)示例是ItemControl - 以ListBox 为例,每个ListBoxItem 都有一个ContentPresenter,列表中的任何内容都设置为ItemsSource

【讨论】:

  • 谢谢,我以为是这样的
【解决方案2】:

这是我能想到的最基本的例子

<Label Content="My Label" />

现在 content 属性是一个不是从UIElement 派生的字符串。所以简短的回答是肯定的,这不仅有可能,而且很有可能发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2011-08-31
    • 2019-08-07
    相关资源
    最近更新 更多