如果我有一个动态创建 XAML 的资源加载器(在这种情况下StackPanel
返回 a),我如何在 xaml 中绑定到它?
我的财产是:
public StackPanel InfoPane {get;set;}
我已经尝试过了,但它不起作用
<Grid>
<ContentPresenter Content="{Binding InfoPane}" />
</Grid>
(抱歉,评论太长了。)
您的方法是正确的,以下最小示例对我有用:
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
已更改。
您不需要绑定,只需在创建 StackPanel 后将 StackPanel 添加到 Children 集合即可。
也就是说,我的建议是采取不同的路线:
在 Grid 中放置一个内容控件并将其内容绑定到实际内容(不是控件),并为每种类型的内容注册一个 ContentTemplate,以便 ContentControl 将根据所显示的内容选择正确的模板。
应尽可能避免在代码中创建 UI,因为它很难维护,而且 WPF 有办法处理依赖于内容的 UI。