【问题标题】:Why is my Dependency Property Binding is not working as expected?为什么我的依赖属性绑定没有按预期工作?
【发布时间】:2021-07-31 21:07:57
【问题描述】:

我正在尝试制作一个包含 ListView 的自定义 UserControl。我想将 SelectedItem 属性绑定到我的视图模型。因此,我在我的用户控件中创建了一个 DP,并将 ListView 的 SelectedItem 属性绑定到新的依赖属性。

        public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
            "SelectedItem",
            typeof(object), 
            typeof(DragAndDropListView),
            new PropertyMetadata(SelectedItemPropertyChangedCallback));

        private static void SelectedItemPropertyChangedCallback(DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
        {
            if (d is DragAndDropListView dragAndDropListView)
            {
            }
        }

        public object SelectedItem
        {
            get => GetValue(SelectedItemProperty);
            set => SetValue(SelectedItemProperty, value);
        }

然后我在 xaml 代码中进行了绑定

            <ListView Name="ListView"
                      PreviewMouseLeftButtonDown="ListViewPreviewMouseLeftButtonDown"
                      AllowDrop="True"
                      MouseMove="ListViewMouseMove"
                      DragEnter="ListViewDragEnter"
                      Drop="ListViewDrop"
                      SelectedItem="{Binding Path= SelectedItem}"/>

为了确保它正常工作,我将 UserControl 作为 DataContext 分配给 ListView

        public DragAndDropListView()
        {
            InitializeComponent();
            ListView.ItemsSource = Items;
            ListView.DataContext = this;
        }

然后我在使用 UserControl 的地方添加了一个绑定。

       <userControls:DragAndDropListView 
                Items="{Binding SelectedCustomers}" 
                SelectedItem="{Binding SelectedCustomer}"
                DisplayMemberPath="Name"
                Grid.Column="0"
                Grid.Row="0"/>

如您所见,我认为我不需要 SelectedItemPropertyChangedCallback。首先,我什至没有实施它。我后来添加了它以添加一个断点以查看它是否有效。当我在 listView 中选择一个项目时,它会调用回调。但是我的 ViewModel 中的 SelectedCustomer 的设置器永远不会被调用。

我希望这能奏效。请帮助我理解我的错误。

【问题讨论】:

    标签: c# wpf mvvm binding dependency-properties


    【解决方案1】:

    绑定必须是双向的:

    SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"
    

    您可以声明该属性,使其默认绑定 TwoWay:

    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register(
            nameof(SelectedItem),
            typeof(object), 
            typeof(DragAndDropListView),
            new FrameworkPropertyMetadata(
                null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                SelectedItemPropertyChangedCallback));
    

    【讨论】:

    • 哦,我根本没想到。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 2016-11-04
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2019-08-28
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多