DependencyProperty和caliburn,视图模型未通过依赖项属性更新

问题描述 投票:0回答:1

我有一个包装了TreeView的视图,称为MbiTreeView。我想从视图模型的(包装)树视图中获取选定的项目。

使用此自定义用户控件的“父”用户控件:

<UserControl [...]>

    <views:MbiTreeView
        Grid.Row="0"
        cal:Bind.Model="{Binding TreeViewModel}"
        SelectedItem="{Binding SelectedItem}">
    </views:MbiTreeView>
</UserControl>

父用户控件绑定到此视图模型:

internal sealed class SomeViewModel : PropertyChangedBase
{
    public object SelectedItem
    {
        get => _selectedItem;
        set
        {
            _selectedItem = value;
            NotifyOfPropertyChange(() => SelectedItem);
        }
    }

    public IMbiTreeViewModel TreeViewModel { get; }

    public SomeViewModel(
        IMbiTreeViewModel treeViewModel)
    {
        TreeViewModel = treeViewModel;
    }
}

MbiTreeView用户控件相当简单。它订阅选择更改事件,并定义一些模板(与该问题无关,因此将其保留在问题中)

<TreeView ItemsSource="{Binding Items}" SelectedItemChanged="TreeView_OnSelectedItemChanged">

iew.ItemContainerStyle>

后面的代码声明依赖项属性:

public partial class MbiTreeView
{
    public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
        nameof(SelectedItem),
        typeof(object),
        typeof(MbiTreeView),
        null);

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

    public MbiTreeView()
    {
        InitializeComponent();
    }

    private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        SelectedItem = e.NewValue;
    }
}

启动应用程序时,我可以浏览树视图项目。当我单击一个树视图节点时,会触发OnSelectedItemChanged事件(我进入那里的断点)。这样,一切都会顺利进行,直到在依赖项属性SelectedItem中设置值为止。

然后,我希望xaml绑定得到通知,并更新视图模型。但这永远不会发生。

我对此一无所知,我们非常感谢您的帮助。

wpf dependency-properties caliburn
1个回答
0
投票

SelectedItem绑定应为双向:

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

您可以声明如下所示的属性以默认情况下绑定TwoWay。

public static readonly DependencyProperty SelectedItemProperty =
    DependencyProperty.Register(
        nameof(SelectedItem),
        typeof(object),
        typeof(MbiTreeView),
        new FrameworkPropertyMetadata(
            null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
© www.soinside.com 2019 - 2024. All rights reserved.