如何在用户控件中提供 Wpf 中的内部控件集合?
How to make available in a usercontrol a inner control collection in Wpf?
我有一个 WPF UserControl
包装了一些其他控件。其中之一是 ItemsControl
,我需要在我的 UserControl
中提供 ItemsControl
的 Items
属性,所以我执行了以下操作:
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 中,UserControl
和 ItemsControl
具有相同的元素,但是当我直接将元素添加到内部 ItemsControl
第一个元素时我添加的内容会自动被选中,当我使用我的 UserControl
执行此操作时,没有发生任何选择,所以出了点问题。
有什么想法吗?
编辑: 该控件是一个向导控件,因为我们总是将它与周围的其他控件一起使用,所以我正在创建一个新的用户控件。如果我在视图中直接使用向导,则自动选择 ItemsSource gest 的第一项,如果我将向导的 ItemsSource 设置为页面 属性,则启动时没有选择页面。
我真的很想知道为什么会这样。
如果您的自定义控件只是 ItemsControl
,您可以从 ItemsControl 派生而不是 UserControl
此外,您在使用 UserControl
时看不到项目被选中,因为在初始化期间发生绑定时,默认值为空集合/null
,因此 SelectedItem
在控件初始化期间是 null
。
稍后,一旦 Pages
属性 获得其值,您需要设置 UserControl
的 SelectedItem
FrameworkPropertyMetadata
有另一个构造函数,您可以在其中指定 PropretyChangedEventHandler
,您可以在其中设置 SelectedItem
或 SelectedIndex
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;
不知道为什么这行得通,而绑定却不行……无论如何……
我有一个 WPF UserControl
包装了一些其他控件。其中之一是 ItemsControl
,我需要在我的 UserControl
中提供 ItemsControl
的 Items
属性,所以我执行了以下操作:
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 中,UserControl
和 ItemsControl
具有相同的元素,但是当我直接将元素添加到内部 ItemsControl
第一个元素时我添加的内容会自动被选中,当我使用我的 UserControl
执行此操作时,没有发生任何选择,所以出了点问题。
有什么想法吗?
编辑: 该控件是一个向导控件,因为我们总是将它与周围的其他控件一起使用,所以我正在创建一个新的用户控件。如果我在视图中直接使用向导,则自动选择 ItemsSource gest 的第一项,如果我将向导的 ItemsSource 设置为页面 属性,则启动时没有选择页面。
我真的很想知道为什么会这样。
如果您的自定义控件只是 ItemsControl
,您可以从 ItemsControl 派生而不是 UserControl
此外,您在使用 UserControl
时看不到项目被选中,因为在初始化期间发生绑定时,默认值为空集合/null
,因此 SelectedItem
在控件初始化期间是 null
。
稍后,一旦 Pages
属性 获得其值,您需要设置 UserControl
SelectedItem
FrameworkPropertyMetadata
有另一个构造函数,您可以在其中指定 PropretyChangedEventHandler
,您可以在其中设置 SelectedItem
或 SelectedIndex
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;
不知道为什么这行得通,而绑定却不行……无论如何……