C# :如何将对象强制转换为 ItemSource 数据类型
本文关键字:转换 ItemSource 数据类型 对象 | 更新日期: 2023-09-27 18:32:47
我正在尝试开发一个自定义用户控件。在我的用户控件中,我使用两个控件:列表框和文本框。文本框用于筛选列表框中的项目。 为此,我的过滤方法遇到了问题。在我的过滤器方法中,我需要将对象转换为 ItemSource 类型。但我不明白我怎么能投掷它。这是我尝试的代码:
public static readonly DependencyProperty ItemSourceProperty = DependencyProperty.Register("ItemSourrce", typeof(IEnumerable), typeof(SSSearchListBox), new PropertyMetadata(new PropertyChangedCallback(OnItemsSourcePropertyChanged)));
private static void OnItemsSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var control = sender as SSSearchListBox;
if (control != null)
control.OnItemsSourceChanged((IEnumerable)e.OldValue, (IEnumerable)e.NewValue);
}
private void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
{
// Remove handler for oldValue.CollectionChanged
var oldValueINotifyCollectionChanged = newValue as INotifyCollectionChanged;
if (null != oldValueINotifyCollectionChanged)
{
oldValueINotifyCollectionChanged.CollectionChanged -= new NotifyCollectionChangedEventHandler(newValueINotifyCollectionChanged_CollectionChanged);
}
// Add handler for newValue.CollectionChanged (if possible)
var newValueINotifyCollectionChanged = newValue as INotifyCollectionChanged;
if (null != newValueINotifyCollectionChanged)
{
newValueINotifyCollectionChanged.CollectionChanged += new NotifyCollectionChangedEventHandler(newValueINotifyCollectionChanged_CollectionChanged);
}
}
void newValueINotifyCollectionChanged_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
//Do your stuff here.
}
public IEnumerable ItemSourrce
{
get { return (IEnumerable)this.GetValue(ItemSourceProperty); }
set { this.SetValue(ItemSourceProperty, value); }
}
public void TextFiltering(ICollectionView filteredview, DevExpress.Xpf.Editors.TextEdit textBox)
{
string filterText = "";
filteredview.Filter = delegate(object obj)
{
if (String.IsNullOrEmpty(filterText))
{
return true;
}
string str = obj as string; // Problem is here.
// I need to cast obj to my ItemSourrce Data Type.
if (String.IsNullOrEmpty(obj.ToString()))
{
return true;
}
int index = str.IndexOf(filterText, 0, StringComparison.InvariantCultureIgnoreCase);
return index > -1;
};
textBox.EditValueChanging += delegate
{
filterText = textBox.Text;
filteredview.Refresh();
};
}
private void textEdit1_GotFocus(object sender, RoutedEventArgs e)
{
ICollectionView view = CollectionViewSource.GetDefaultView(ItemSourrce);
TextFiltering(view, textEdit1);
}
调用此使用控件:
List<testClass> myList = new List<testClass>();
public void testMethod()
{
for (int i = 0; i < 20; i++)
{
myList.Add(new testClass { testData=i.ToString()});
}
myTestControl.ItemSourrce = myList;
}
public class testClass
{
public string testData { get; set; }
}
谢谢
你想要断言到ItemSource(或用于命名一致性的ItemsSource)的所有内容都必须实现IEnumerable接口。Thist 意味着基本上你可以遍历一个 foreach(简单地说)。所以每个列表,数组,集合,字典等等。
正常,您无法通过开箱即用的正常字符串进行迭代!
因此,如果您的对象实际上是一个字符串(在调试时用断点检查它),则必须以某种方式拆分它。
PS:顺便说一下这段代码
if (String.IsNullOrEmpty(obj.ToString()))
{
return true;
}
从不(除了一些罕见的无意义示例,其中显式返回 ToStirng() 的空字符串)返回 true,因为 obj。ToString() 永远不会为 null 或 Empty。在类型对象(每个 .net 类型都基于该类型)的标准实现中,它返回命名空间和类型名称。
如果我理解得很好,你的对象是 testClass
型而不是string
型。
因此,您的代码应该是您尝试进行转换的地方。
string str = string.Empty;
testClass myObject = obj as testClass;
if (myObject == null)
return true;
else
str = myObject.testData;
if (string.IsNullOrEmpty(str))
return true;
return str.IndexOf(filterText, 0, StringComparison.InvariantCultureIgnoreCase) > -1;