在代码中绑定到XAML

时间:2013-07-01 14:51:12

标签: c# wpf xaml

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

我的财产是:

public StackPanel InfoPane {get;set;}

我试过这个,但它不起作用

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

2 个答案:

答案 0 :(得分:1)

您不需要绑定,所有您需要做的就是在创建StackPanel时将StackPanel添加到Children集合。

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

将内容控件放入网格并将其内容绑定到实际内容(而不是控件),并为ContentTemplate注册每种类型的内容,以便ContentControl根据显示的内容选择正确的模板。

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

答案 1 :(得分: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,因此用户界面无法知道InfoPane已更改。