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

How to make available in a usercontrol a inner control collection in Wpf?

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

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 执行此操作时,没有发生任何选择,所以出了点问题。

有什么想法吗?

编辑: 该控件是一个向导控件,因为我们总是将它与周围的其他控件一起使用,所以我正在创建一个新的用户控件。如果我在视图中直接使用向导,则自动选择 ItemsSource gest 的第一项,如果我将向导的 ItemsSource 设置为页面 属性,则启动时没有选择页面。

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

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

此外,您在使用 UserControl 时看不到项目被选中,因为在初始化期间发生绑定时,默认值为空集合/null,因此 SelectedItem在控件初始化期间是 null。 稍后,一旦 Pages 属性 获得其值,您需要设置 UserControl

SelectedItem

FrameworkPropertyMetadata 有另一个构造函数,您可以在其中指定 PropretyChangedEventHandler,您可以在其中设置 SelectedItemSelectedIndex

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

    public static DependencyProperty PagesProperty = PagesPropertyKey.DependencyProperty;

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

        private static void OnPagesChanged(DependencyObject o, DependencyPropertyChangedEventArgs args)
        {
//play with DepedencyObject here; cast it to type MyControl and assign/change instance variables
//Raise some events which can be bubbled.
//Set SelectedIndex here
        }

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

this.ItemsControlInnerControl.ItemsSource = this.Pages;

不知道为什么这行得通,而绑定却不行……无论如何……