主题确实说明了一切。
<CollectionViewSource x:Key="MyData" Source="{Binding}" Filter="{ SomethingMagicInXaml? }" />
这并不是说我没有代码。它只是在me我。
如果您“足够努力”,直到在其中编写整个程序,您都可以在XAML中执行几乎所有操作。
您永远不会回避代码(嗯,如果您使用库,则不必编写任何代码,但是应用程序当然仍然依赖它),这是在这种特定情况下可以执行的示例:
<CollectionViewSource x:Key="Filtered" Source="{Binding DpData}" xmlns:me="clr-namespace:Test.MarkupExtensions"> <CollectionViewSource.Filter> <me:Filter> <me:PropertyFilter PropertyName="Name" Value="Skeet" /> </me:Filter> </CollectionViewSource.Filter> </CollectionViewSource> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Markup; using System.Windows.Data; using System.Collections.ObjectModel; using System.Windows; using System.Text.RegularExpressions; namespace Test.MarkupExtensions { [ContentProperty("Filters")] class FilterExtension : MarkupExtension { private readonly Collection<IFilter> _filters = new Collection<IFilter>(); public ICollection<IFilter> Filters { get { return _filters; } } public override object ProvideValue(IServiceProvider serviceProvider) { return new FilterEventHandler((s, e) => { foreach (var filter in Filters) { var res = filter.Filter(e.Item); if (!res) { e.Accepted = false; return; } } e.Accepted = true; }); } } public interface IFilter { bool Filter(object item); } // Sketchy Example Filter public class PropertyFilter : DependencyObject, IFilter { public static readonly DependencyProperty PropertyNameProperty = DependencyProperty.Register("PropertyName", typeof(string), typeof(PropertyFilter), new UIPropertyMetadata(null)); public string PropertyName { get { return (string)GetValue(PropertyNameProperty); } set { SetValue(PropertyNameProperty, value); } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(PropertyFilter), new UIPropertyMetadata(null)); public object Value { get { return (object)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly DependencyProperty RegexPatternProperty = DependencyProperty.Register("RegexPattern", typeof(string), typeof(PropertyFilter), new UIPropertyMetadata(null)); public string RegexPattern { get { return (string)GetValue(RegexPatternProperty); } set { SetValue(RegexPatternProperty, value); } } public bool Filter(object item) { var type = item.GetType(); var itemValue = type.GetProperty(PropertyName).GetValue(item, null); if (RegexPattern == null) { return (object.Equals(itemValue, Value)); } else { if (itemValue is string == false) { throw new Exception("Cannot match non-string with regex."); } else { return Regex.Match((string)itemValue, RegexPattern).Success; } } } } }
如果您想在XAML中做某事,标记扩展是您的朋友。
(您可能想拼写扩展名,即me:FilterExtension,由于Visual Studio中的动态检查可能会毫无理由地抱怨,它当然仍会编译和运行,但警告可能会令人讨厌。 也不要指望CollectionViewSource.Filter扩展名。出现在IntelliSense中,它不希望您通过XML-element- notation设置该处理程序)
me:FilterExtension
CollectionViewSource.Filter