WPF无法从自定义用户控件绑定依赖项属性

时间:2014-03-09 00:54:46

标签: wpf binding dependency-properties propertychanged idictionary

我的Custom UserControl中有MultiSelectComboBox UserControl。 我想将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();
    }

My Custum UserControl的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)。

2 个答案:

答案 0 :(得分:0)

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

关于,

  

我的ViewModel属性

没有任何变化

您是否也在View中更新(SetValue)此属性?或者它是否相反?

答案 1 :(得分:0)

对我有用的解决方案是使用值转换器接口,你也正确使用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接口来处理Dictionary并将其转换为我需要的......

感谢您帮助我获得解决方案,猜猜我节省了几个小时......