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 がログにバインドされている
<ListView x:Name="LogView" Grid.Row="0" ItemContainerStyle="{StaticResource LogMessageStyle}" ItemsSource="{Binding Log, ElementName=LogControl}" >
ListView の下には、ブール値にバインドされたチェックボックスがあり、特定の行をフィルター処理する必要があるかどうかを示します。
<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
}