1

如果我有一个动态创建 XAML 的资源加载器(在这种情况下StackPanel返回 a),我如何在 xaml 中绑定到它?

我的财产是:

public StackPanel InfoPane {get;set;}

我已经尝试过了,但它不起作用

<Grid>
    <ContentPresenter Content="{Binding InfoPane}" />
</Grid>
4

2 回答 2

1

(抱歉,评论太长了。)

您的方法是正确的,以下最小示例对我有用:

XAML:

<Grid>
    <ContentPresenter Content="{Binding InfoPane}" />
</Grid>

代码隐藏:

public StackPanel InfoPane { get; set; }

public MainWindow()
{
    InitializeComponent();
    InfoPane = new StackPanel();
    InfoPane.Children.Add(new TextBlock { Text = "dynamically created" });
    this.DataContext = this;
}

所以,你的问题一定出在其他地方。也许你在设置你的窗口的属性InfoPane 之后设置你的?DataContext请注意,您不调用PropertyChanged,因此 UI 无法知道InfoPane已更改。

于 2013-07-01T15:02:54.283 回答
1

您不需要绑定,只需在创建 StackPanel 后将 StackPanel 添加到 Children 集合即可。

也就是说,我的建议是采取不同的路线:

在 Grid 中放置一个内容控件并将其内容绑定到实际内容(不是控件),并为每种类型的内容注册一个 ContentTemplate,以便 ContentControl 将根据所显示的内容选择正确的模板。

应尽可能避免在代码中创建 UI,因为它很难维护,而且 WPF 有办法处理依赖于内容的 UI。

于 2013-07-01T14:59:08.387 回答