【问题标题】:WPF Cannot Bind Dependancy Property From Custom UserControlWPF 无法从自定义 UserControl 绑定依赖属性
【发布时间】:2014-03-09 00:54:46
【问题描述】:

我的自定义用户控件中有 MultiSelectComboBox 用户控件。 我想将 Dictionary 类型的 SelectedItems 依赖属性(来自上面的 MSCB)绑定到 My ViewModel 属性中的任何一个...

*MSBC 表示 --> MultiSelectComboBox UserControl !!!!!

MSCB 背后的代码: 定义 DP:

    public static readonly DependencyProperty SelectedItemsProperty =
     DependencyProperty.Register("SelectedItems", typeof(Dictionary<string, object>), typeof    (MultiSelectComboBox), new FrameworkPropertyMetadata(null,
       new PropertyChangedCallback(MultiSelectComboBox.OnSelectedItemsChanged)));

在 MSCB 中定义 SelectedItems 属性:

     public Dictionary<string, object> SelectedItems
    {
        get { return (Dictionary<string, object>)GetValue(SelectedItemsProperty); }
        set
        {
            SetValue(SelectedItemsProperty, value);
        }
    }

      private static void OnSelectedItemsChanged(DependencyObject d,      DependencyPropertyChangedEventArgs e)
    {

        MultiSelectComboBox ctrl = (MultiSelectComboBox)d;
        ctrl.SelectNodes();
        ctrl.SetText();
    }

我的自定义用户控件的 Xaml: 在 Xaml 中定义 MSCB:

      <MultiSelectComboBox:MultiSelectComboBox  x:Name="WorkDay" 
        SelectedItems="{Binding SelectedItemsInViewModel}" 
        ItemsSource="{Binding WorkDays,Converter={StaticResource DataConverter}}"/> 

在我的 ViewModel 类中:

    private Dictionary<string, object> si= new Dictionary<string, object>();
    public Dictionary<string, object> SelectedItemsInViewModel
    {
        get { return si; }
        set 
        { 
            si = value;
            OnPropertyChanged("SelectedItemsInViewModel");
        }
    }

看起来 OnEventChanged(MSBC 内的 DProperty 的)仅在第一次初始化时触发,然后停止触发。 我的 ViewModel 属性没有任何变化。 我已将数据上下文设置为指向我的 ViewModel 类,并且此 CustomControl 中的其他绑定工作正常(如 TextBoxes)。

【问题讨论】:

  • 每次调用SelectedItemsInViewModel的setter时,是否都会创建一个新的Dictionary?你能展示你如何更新你的视图模型吗?

标签: wpf binding dependency-properties propertychanged idictionary


【解决方案1】:

您的代码似乎不完整。 如果想法是实现一个多选组合框,那么您需要的不仅仅是定义一个 SelectedItems 属性 - 您需要在选择/取消选择项目时填充它。

关于,

我的 ViewModel 属性没有任何变化

您是否也从 View 更新 (SetValue) 此属性?还是反其道而行之?

【讨论】:

  • Amby 感谢您的帮助...从我的角度来看,我不使用 (SetValue),仅在我的 MSCB 后面的代码中使用。没搞懂populate SelectedItems的想法,我是在MSCB后面的代码里做的:ctrl.SelectNodes();//设置选中项ctrl.SetText();//设置combobx文本我贴了上面的相关代码.类的结构是:MSCB UserControl --> UserControl 包含MSCB --> ViewModel Class
【解决方案2】:

对我有用的解决方案是使用值转换器接口,你使用 SetValue() 也是对的,我已经使用了它,但是当我更改 SelectedItems 字典时没有设置 SelectedItems 字典,因为 DP 指向引用对象并且当列表没有任何变化时,除非您每次都更改 DP 地址,所以我添加了这一行:SelectedItems = SelectedItems;

      private void SetSelectedItems()
      {
      if (SelectedItems == null)
            SelectedItems = new Dictionary<string, object>();
        SelectedItems.Clear();
        foreach (Node node in _nodeList)
        {
            if (node.IsSelected && node.Title != "ALL")
            {
                if (this.ItemsSource.Count > 0)

                    SelectedItems.Add(node.Title, this.ItemsSource[node.Title]);
            }
        }
        SelectedItems = SelectedItems;  //ADDED THIS LINE SOLEVED The DP not changed Problem
       }

之后,我在 ViewModel 中使用了 IValueConverter 接口来处理字典并将其转换为我需要的内容......

感谢您帮助我找到解决方案,我想我又节省了几个小时......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多