WPF绑定到自定义属性不起作用

时间:2014-09-19 02:21:12

标签: c# wpf binding

我有这个控件来显示用户控件列表

<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是有效的。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您错误地实现了依赖项属性。您应该使用GetValueSetValue方法,而不是创建自动属性。

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可能就足够了。