我正在尝试制作另一个UserControl_2的UserControl(GridSearch)。我想使用XAML将一些FrameworkElements添加到UserControl_2面板。
所以我在GridSearch中做了ObservableCollection DependencyProperty:
public partial class GridSearch : UserControl
{
public GridSearch()
{
InitializeComponent();
}
public ObservableCollection<Filter> Filters
{
get { return (ObservableCollection<Filter>)GetValue(FiltersProperty); }
set { SetValue(FiltersProperty, value); }
}
public static readonly DependencyProperty FiltersProperty =
DependencyProperty.Register("Filters",
typeof(ObservableCollection<Filter>),
typeof(GridSearch),
new FrameworkPropertyMetadata(getObservableFilters(), null)
);
private static ObservableCollection<Filter> getObservableFilters()
{
var ob = new ObservableCollection<Filter>();
ob.CollectionChanged += ob_CollectionChanged;
return ob;
}
private static void ob_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
}
}
现在我尝试使用ob_CollectionChanged向面板添加新元素。但是因为它是静态方法我无法访问面板。我无法转发发件人,因为它只给我ObservableCollection。但是我需要GridSearch。
我正在寻找几个小时的解决方案,我无法找到任何解决方法。
答案 0 :(得分:1)
将getObservableFilters()方法更改为仅创建并返回可观察集合。
在GridSearch()构造函数中,在调用InitializeComponent()之后,可以为Filters.CollectionChanged添加处理程序并提供非静态成员函数。
答案 1 :(得分:0)
好的,最后关键是在构造函数中为每个控件实例创建新的ObservableCollection()。
然而,仍有一个问题。一切都在运行时工作,但设计师无法显示任何内容,因为它会出现以下错误:
未将对象引用设置为对象的实例。
这是tabout这一行:<gsh:GridSearch.Filters>
这是我最终得到的代码:
public partial class GridSearch : UserControl
{
public GridSearch()
{
Filters = new ObservableCollection<Label>();
InitializeComponent();
Filters.CollectionChanged += Filters_CollectionChanged;
}
void Filters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach (Label uc in e.NewItems)
pnlFilters.Children.Add(uc);
}
public ObservableCollection<Label> Filters
{
get { return (ObservableCollection<Label>)GetValue(FiltersProperty); }
set { SetValue(FiltersProperty, value); }
}
public static readonly DependencyProperty FiltersProperty =
DependencyProperty.Register("Filters",
typeof(ObservableCollection<Label>),
typeof(GridSearch),
new FrameworkPropertyMetadata(new ObservableCollection<Label>(), null)
);
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<gsh:GridSearch>
<gsh:GridSearch.Filters>
<Label Content="aa" />
<Label Content="aa" />
<Label Content="aa" />
</gsh:GridSearch.Filters>
</gsh:GridSearch>
<gsh:GridSearch Grid.Row="1">
<gsh:GridSearch.Filters>
<Label Content="bb" />
<Label Content="cc" />
<Label Content="dd" />
</gsh:GridSearch.Filters>
</gsh:GridSearch>
</Grid>