在视图模型中使用mvvm消息的字符串值作为变量

本文关键字:字符串 变量 消息 mvvm 模型 视图 | 更新日期: 2023-09-27 17:59:57

我正在根据viewModel 2中数据网格的选择更改来筛选viewModel 1中的列表集合视图。为此,我使用mvvm消息传递。每次数据网格的选择发生变化时,都会发送一条消息来更新我的listcollectionview。这一切都很好。

现在我需要使用这个消息的字符串值来传递到过滤器中。问题是,我只能在updateShotList方法中使用字符串值,而不能在bool IsMatch中使用。我该如何实现这一点,或者如何在视图模型中使用消息的字符串值作为变量。

这就是我的视图模型的样子。

private ObservableCollection<Shot> _allShots = new ObservableCollection<Shot>();
public ObservableCollection<Shot> AllShots
    {
        get { return _allShots; }
        set { _allShots = value; RaisePropertyChanged();}
    }
private ListCollectionView _allShotsCollection;
public ListCollectionView AllShotsCollection
    {
        get
        {
            if (_allShotsCollection == null)
            {
                _allShotsCollection = new ListCollectionView(this.AllShots);
            }
           return _allShotsCollection;
        }
        set
        {
            _allShotsCollection = value; RaisePropertyChanged();
        }
   }
private void UpdateShotList(string SceneNr) // value sceneNr comes from message from viewmodel 2
    {
        _allShotsCollection.IsLiveFiltering = true;
        _allShotsCollection.Filter = new Predicate<object>(IsMatchFound);
    }
    bool IsMatchFound(object obj)
    {
=====>  if (obj as Shot != null && (obj as Shot).SceneNumber == "?????") // Here I need the value of string ScenNr that comes from the message.
        {
            return true;
        }
        return false;
    }
    public ShotListViewModel()
    {
        Messenger.Default.Register<string>(this, "UpdateShotList", UpdateShotList);
    }

在视图模型中使用mvvm消息的字符串值作为变量

您可以将谓词创建为lambda表达式,并关闭SceneNr以捕获它:

_allShotsCollection.Filter = o =>
{
    var shot = o as Shot;
    return shot != null && shot.SceneNumber == SceneNr;
};

或者,只需引入一个实例变量来包含过滤器字符串,并在每次收到消息时更新它:

private string _sceneNr; 
private void UpdateShotList(string sceneNr)
{
    // ...
    _sceneNr = sceneNr;
}
bool IsMatchFound(object obj)
{
    var shot = obj as Shot;
    return shot != null && shot.SceneNumber == _sceneNr;
}