我有一个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 UserControl
和ItemsControl
具有相同的元素但是当我直接将元素添加到内部ItemsControl
时我添加的第一个元素自动选择,当我使用我的UserControl
进行选择时,没有选择发生,所以出现问题。
有什么想法吗?
编辑:该控件是一个向导控件,因为我们总是使用其他一些控件来创建一个新的Usercontrol。如果我直接使用向导中的向导自动选择ItemsSource的第一项,如果我将向导的ItemsSource设置为Pages属性,则启动时没有选定的页面。
我真的很想知道为什么会这样。
答案 0 :(得分:1)
如果您的自定义控件只是ItemsControl
,您可以从ItemsControl而不是UserControl
派生
在使用UserControl
时,您也看不到正在选择的项目,因为在初始化期间发生绑定时,默认值为空集合/ null
,因此SelectedItem
为{在控件初始化期间{1}}。
稍后,null
属性获得其值后,您需要设置Pages
的{{1}}
SelectedItem
有另一个构造函数,您可以在其中指定UserControl
,您可以在其中设置FrameworkPropertyMetadata
或PropretyChangedEventHandler
SelectedItem
答案 1 :(得分:0)
我解决了用构造函数调用替换ItemsSource绑定:
this.ItemsControlInnerControl.ItemsSource = this.Pages;
不知道为什么这会起作用而且绑定不会......反正......