如何在用户控件中使用Wpf中的内部控件集合?

时间:2015-01-13 16:15:51

标签: c# wpf data-binding binding user-controls

我有一个WPF UserControl包装其他一些控件。其中一个是ItemsControl,我需要在UserControl Items ItemsControl属性中提供,因此我执行了以下操作:

public partial class MyControl : UserControl
{
    private static readonly DependencyPropertyKey PagesPropertyKey = DependencyProperty.RegisterReadOnly("Pages", typeof(ObservableCollection<XXX>), typeof(MyControl), new FrameworkPropertyMetadata(new ObservableCollection<XXX>()));

    public static DependencyProperty PagesProperty = PagesPropertyKey.DependencyProperty;

    public ObservableCollection<XXX> Pages
    {
        get { return (ObservableCollection<XXX>) base.GetValue(PagesProperty); }
        set { base.SetValue(PagesProperty, value); }
    }
}

然后在XAML中ItemsControl具有以下内容:

ItemsSource="{Binding Pages, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:TypeExtension views1:MyControl}}}"

我认为这应该有用,实际上看看Snoop UserControlItemsControl具有相同的元素但是当我直接将元素添加到内部ItemsControl时我添加的第一个元素自动选择,当我使用我的UserControl进行选择时,没有选择发生,所以出现问题。

有什么想法吗?

编辑:该控件是一个向导控件,因为我们总是使用其他一些控件来创建一个新的Usercontrol。如果我直接使用向导中的向导自动选择ItemsSource的第一项,如果我将向导的ItemsSource设置为Pages属性,则启动时没有选定的页面。

我真的很想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

如果您的自定义控件只是ItemsControl,您可以从ItemsControl而不是UserControl派生

在使用UserControl时,您也看不到正在选择的项目,因为在初始化期间发生绑定时,默认值为空集合/ null,因此SelectedItem为{在控件初始化期间{1}}。 稍后,null属性获得其值后,您需要设置Pages的{​​{1}}

SelectedItem有另一个构造函数,您可以在其中指定UserControl,您可以在其中设置FrameworkPropertyMetadataPropretyChangedEventHandler

SelectedItem

答案 1 :(得分:0)

我解决了用构造函数调用替换ItemsSource绑定:

this.ItemsControlInnerControl.ItemsSource = this.Pages;

不知道为什么这会起作用而且绑定不会......反正......