【问题标题】:DependencyProperty and caliburn, view model not updated by dependency propertyDependencyProperty 和 caliburn,视图模型未由依赖属性更新
【发布时间】:2019-11-14 15:33:58
【问题描述】:

我有一个包含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 用户控件相当简单。它订阅了 selection changed 事件,并定义了一些模板(与这个问题无关,所以把它们放在问题中)

<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】:

    SelectedItem 绑定应该是 TwoWay:

    <views:MbiTreeView ...
        SelectedItem="{Binding SelectedItem, Mode=TwoWay}"/>
    

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

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

    【讨论】:

    • 终于....想通了。是的,你是对的,我应该进行双向绑定(关于依赖属性的默认行为的重要提示,还不知道)。但是,问题是,绑定“以某种方式”绑定到 TreeViewModel。一组使用cal:Bind.Model="{Binding TreeViewModel}"。我有这种感觉,所以我也在MbiTreeViewModel 上添加了SelectedItem 属性,并且那个确实 命中了断点……所以我进行了相对源绑定,然后它就可以工作了!
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2013-03-15
    • 2011-12-21
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多