gpt4 book ai didi

c# - 未调用 ICollectionView 过滤器

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:28 29 4
gpt4 key购买 nike

我创建了一个小型用户控件,其中包含一个 ICollectionView 和一个 ObservableCollection。

ObservableCollection<LogMessage> messages;
public ObservableCollection<LogMessage> Messages
{
get { return messages; }
}

ICollectionView log;
public ICollectionView Log
{
get { return log; }
}

变量在UserControl的构造函数中设置

public LogFilter()
{
messages = new ObservableCollection<LogMessage>();
log = new CollectionView(messages);

InitializeComponent();

#if DEBUG

messages.Add(new LogMessage("This is a general Message", MessageType.General));
messages.Add(new LogMessage("This is a server Message", MessageType.Server));
messages.Add(new LogMessage("This is an info", MessageType.Info));
messages.Add(new LogMessage("This is an error", MessageType.Error));
messages.Add(new LogMessage("This is a warning", MessageType.Warning));

#endif
}

UserControl中的ListView绑定(bind)到Log

<ListView x:Name="LogView" Grid.Row="0" ItemContainerStyle="{StaticResource LogMessageStyle}" ItemsSource="{Binding Log, ElementName=LogControl}" >

在ListView下面,有一个Checkbox,绑定(bind)了一个 bool 值,表示是否过滤某行。

<CheckBox IsChecked="{Binding HideServer, ElementName=LogControl}" VerticalAlignment="Center" Width="75">



public bool filterServer(object o)
{
LogMessage m = o as LogMessage;
if ((m.MessageType == MessageType.Server) && (hideServer == true))
return false;
return true;
}

public bool HideServer
{
get
{
return hideServer;
}
set
{
hideServer = value;

if (hideServer)
Log.Filter = new Predicate<object>(filterServer);
else
Log.Filter = null;

notifyPropertyChanged();
log.Refresh();
}
}

选中复选框后,过滤器会正确添加到 ICollectionView,但不会过滤列表框的内容。 filterServer(object o) 函数未被调用。这段代码有问题吗?我使用调试器单步调试代码,Log.Refresh() 似乎没有效果。

附加信息

PropertyChanged 事件定义为

public event PropertyChangedEventHandler PropertyChanged;

private void notifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

LogMessage 和 MessageType 定义为

public class LogMessage
{
public DateTime Timestamp { get; private set; }
public LogFilter.MessageType MessageType { get; private set; }
public string Message { get; private set; }

public LogMessage(string Message)
{
initalize(DateTime.Now, LogFilter.MessageType.General, Message);
}

public LogMessage(string Message, DateTime Timestamp)
{
initalize(Timestamp, LogFilter.MessageType.General, Message);
}

public LogMessage(string Message, LogFilter.MessageType MessageType)
{
initalize(DateTime.Now, MessageType, Message);
}

public LogMessage(string Message, DateTime Timestamp, LogFilter.MessageType MessageType)
{
initalize(Timestamp, MessageType, Message);
}

private void initalize(DateTime timestamp, LogFilter.MessageType messageType, string message)
{
Timestamp = timestamp;
MessageType = messageType;
Message = message;
}
}

public enum MessageType
{
Server,
Info,
Warning,
Error,
General
}

最佳答案

我不知道这是否是导致问题的原因,但是 CollectionView 类的文档说:

You should not create objects of this class in your code

相反,一种可能的解决方案是使用 CollectionViewSource.GetDefaultView 获取 ICollectionView:

log = CollectionViewSource.GetDefaultView(messages);

请注意,您不需要公开 Log 并绑定(bind)到它;您可以绑定(bind)到 Messages,因为在后台,WPF 将使用集合的默认 View ,这与 CollectionViewSource.GetDefaultView 返回的 View 相同。

关于c# - 未调用 ICollectionView 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624260/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com