Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetValue不获取我的附加属性中的任何值”;选择editemshelper";_C#_Combobox_Telerik_Multi Select_Attached Properties - Fatal编程技术网

C# GetValue不获取我的附加属性中的任何值”;选择editemshelper";

C# GetValue不获取我的附加属性中的任何值”;选择editemshelper";,c#,combobox,telerik,multi-select,attached-properties,C#,Combobox,Telerik,Multi Select,Attached Properties,我希望我能在这里找到一些帮助。我正在使用telerik,并获得了一个具有多功能的RadComboBox。我通过使用名为“SelectItemsHelper”的附加属性扩展了RadComboBox的功能,并将所需的项添加到ComboBox的SelectedItems集合中。但是当我尝试获取所选项目时,我没有得到任何值。我做错了什么 我的SelectedItemsHelper using System.Collections; using System.Windows; using Telerik.

我希望我能在这里找到一些帮助。我正在使用telerik,并获得了一个具有多功能的RadComboBox。我通过使用名为“SelectItemsHelper”的附加属性扩展了RadComboBox的功能,并将所需的项添加到ComboBox的SelectedItems集合中。但是当我尝试获取所选项目时,我没有得到任何值。我做错了什么

我的SelectedItemsHelper

using System.Collections;
using System.Windows;
using Telerik.Windows.Controls;

namespace WpfAutoQuery
{
    public class SelectedItemsHelper
    {
    
        public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), typeof(SelectedItemsHelper), new FrameworkPropertyMetadata((IList)null, new PropertyChangedCallback(OnSelectedItemsChanged)));
          
        public static IList GetSelectedItems(DependencyObject d)
        {
            return (IList)d.GetValue(SelectedItemsProperty);
        }

        public static void SetSelectedItems(DependencyObject d, IList value)
        {
            d.SetValue(SelectedItemsProperty, value);
        }

        private static void OnSelectedItemsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var comboBox = sender as RadComboBox;
            if (comboBox != null)
            {                
                IList selectedItems = GetSelectedItems(comboBox);
                if(selectedItems != null)
                {
                      comboBox.SelectedItems.Clear();
                      foreach (var item in selectedItems)
                      {
                          comboBox.SelectedItems.Add(item);
                      }
                }
            }                               
        }
     }
}
private static void OnSelectedItemsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var comboBox = sender as RadComboBox;
        IList coll = e.NewValue as IList;

        if (coll is INotifyCollectionChanged)
        {
            (coll as INotifyCollectionChanged)
                .CollectionChanged += (s, e3) =>
                {
                    if (null != e3.OldItems)
                        foreach (var item in e3.OldItems)
                            comboBox.SelectedItems.Remove(item);
                    if (null != e3.NewItems)
                        foreach (var item in e3.NewItems)
                            comboBox.SelectedItems.Add(item);
                };
        }
        if (null != coll)
        {
            if (coll.Count > 0)
            {
                comboBox.SelectedItems.Clear();
                foreach (var item in coll)
                    comboBox.SelectedItems.Add(item);
            }

            comboBox.SelectionChanged += (s, e2) =>
            {
                if (null != e2.RemovedItems)
                    foreach (var item in e2.RemovedItems)
                        coll.Remove(item);
                if (null != e2.AddedItems)
                    foreach (var item in e2.AddedItems)
                        coll.Add(item);
            };
        }
我的盒子在视野中

<telerik:RadComboBox Name="rcbSection" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Margin="10" IsEditable="False"
                     ItemsSource="{Binding Sections}" DisplayMemberPath="Line1" AllowMultipleSelection="True"  
                     local:SelectedItemsHelper.SelectedItems="{Binding SelectedSections}">                                              
</telerik:RadComboBox>

ViewModel中的My SelectedSections属性

public ObservableCollection<Section> SelectedSections
        {
            get { return GetPropertyValue<ObservableCollection<Section>>(); }
            set { SetPropertyValue(value); }
        }
public observeablecollection SelectedSections
{
获取{return GetPropertyValue();}
set{SetPropertyValue(value);}
}
节课

 public class Section : INotifyPropertyChanged
    {
        public Section(string line1)
        {
            this.Line1 = line1;                
        }
        
        public string Line1
        {
            get { return GetPropertyValue<string>(); }
            set { SetPropertyValue(value); }
        }
公共类部分:INotifyPropertyChanged
{
公共部分(字符串行1)
{
此参数为0.Line1=Line1;
}
公共字符串行1
{
获取{return GetPropertyValue();}
set{SetPropertyValue(value);}
}
我在调试时做了一个截图

我找到了一个解决方案。但这也要感谢Stackoverflow。我找到了一个与我的主题类似的解决方案,并且有一位用户用一个解决方案非常详细地回答了这个问题。但是,我不太明白为什么它现在能起作用。也许有人能解释一下区别或者到底发生了什么

到目前为止我改变了什么:

视图模型

public ObservableCollection<Section> SelectedSections
        {
            get { return GetPropertyValue<ObservableCollection<Section>>(); }
            set { SetPropertyValue(value); }
        }
private ObservableCollection<Section> _selectedSections = new ObservableCollection<Section>();
public ObservableCollection<Section> SelectedSections
{
    get { return _selectedSections; }
} 

var selectedSectionList = _selectedSections;

更改附加的属性值时会调用回调。事实上,如果您只是向
ObservaleCollection
添加/删除项,则不会调用回调,只会分配
ObservaleCollection
的全新实例。不确定
SetPropertyValue
是否上升
PropertyChanged
,请选择s确实如此。您没有显示向
SelectedSections
添加内容的部分,一个简单的解决方法是在添加项目后设置
SelectedSections=null
,然后返回(当然,在每一步之后,属性都会发生变化)@Sinatr谢谢你的回答。那么,你所描述的这种情况是否在SelectedItemsChanged中的SelectedItemsShelper中还没有发生?屏幕截图上的断点是否在发布时(第一次)命中对吗?我希望此时可观察集合只是空的。稍后,当你添加项时,断点不会出现,对吗?@Sinatr是的,你是对的。它第一次在那里被击中。我不明白的是为什么“GetSelectedItems”不要从var combobox中获取任何项目。正如您在屏幕截图中看到的,var combobox有9个值,并且还包含SelectionBoxItems。那么为什么它不将其传递给IList selectedItems?我不确定您现在正在尝试做什么,但是
combobox
项目与附加的属性值无关。您是将属性
SelectedSections
绑定到附加属性,仅此而已。组合框中有多少项无关紧要。
SelectedSections
为空。我假设您在viewmodel或code behind中处理选择,然后为
SelectedSections
设置新值,只有这样它才能在回调中可用。