C# GetValue不获取我的附加属性中的任何值”;选择editemshelper";
我希望我能在这里找到一些帮助。我正在使用telerik,并获得了一个具有多功能的RadComboBox。我通过使用名为“SelectItemsHelper”的附加属性扩展了RadComboBox的功能,并将所需的项添加到ComboBox的SelectedItems集合中。但是当我尝试获取所选项目时,我没有得到任何值。我做错了什么 我的SelectedItemsHelperC# 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.
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
设置新值,只有这样它才能在回调中可用。