我有这个控件来显示用户控件列表
<ItemsControl x:Name="LayersList" Margin="10,284,124,0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<NaturalGroundingPlayer:LayerControl Item="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
LayerControl控件包含此代码
public partial class LayerControl : UserControl {
public LayerItem Item { get; set; }
public static readonly DependencyProperty ItemProperty =
DependencyProperty.Register(
"Item",
typeof(LayerItem),
typeof(LayerControl),
new PropertyMetadata(null));
public LayerControl() {
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e) {
// This doesn't work because Item remains null
MainWindow.Instance.LayersList.Items.Remove(Item);
}
}
LayerItem包含此
[PropertyChanged.ImplementPropertyChanged]
public class LayerItem {
public LayerType Type { get; set; }
public string FileName { get; set; }
}
public enum LayerType {
Audio,
Video,
Image
}
问题是:Binding将Item属性设置为null。如果我将绑定更改为{Binding Type}
而不是{Binding}
(并相应地调整属性类型),那么它可以正常工作。但我找不到绑定整个对象的方法。我做错了什么?
在旁注中,我尝试将ItemsControl.ItemsSource
设置为ObservableCollection<LayerItem>
,但这似乎不起作用。直接将项目添加到ItemsControl.Items
是有效的。知道为什么会这样吗?
答案 0 :(得分:1)
您错误地实现了依赖项属性。您应该使用GetValue
和SetValue
方法,而不是创建自动属性。
public static readonly DependencyProperty ItemProperty =
DependencyProperty.Register(
"Item", typeof(LayerItem), typeof(LayerControl));
public LayerItem Item
{
get { return (LayerItem)GetValue(ItemProperty); }
set { SetValue(ItemProperty, value); }
}
P.S。您不应该访问以下控件:MainWindow.Instance.LayersList.Items.Remove(Item)
。你应该使用MVVM。我也不相信这个属性是必需的。 DataContext
可能就足够了。