WPF无法从自定义UserControl绑定依赖属性



我在自定义UserControl内部具有MultiSelectCombobox UserControl。我想将selectedItems依赖属性(从上面的MSCB绑定到我的任何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();
    }

我的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");
        }
    }

看起来(MSBC内部的dproperty)似乎仅用于第一个初始化,然后停止触发。我在ViewModel属性中没有任何更改。我将数据上下文设置为指向我的ViewModel类,并且此fundercontrol中的其他绑定工作正常(例如文本框)。

看起来您的代码不完整。如果想法是实现多选择组合框,那么您不仅需要定义SelectedItems属性 - 当选择/未选择项目时,您需要将其填充。

关于,

我没有在我的ViewModel属性中获得任何更改

您是否也从视图中更新(setValue)此属性?还是另一回合?

解决方案对我有用的解决方案是使用值转换器接口,您也对使用setValue()是正确的SelectedItems字典是因为DP指向参考对象,并且当列表更改列表时,除非您每次更改DP地址,否则我添加了此行:selectionItems = selectionItems;

      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
       }
之后

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

最新更新