使用 mvvm 消息的字符串值作为视图模型中的变量
use string value of mvvm message as variable in viewmodel
我正在根据 viewModel 2 中数据网格的选择更改过滤 viewModel 1 中的 listcollectionview。为此,我使用 mvvm 消息传递。每次数据网格的选择发生变化时,都会发送一条消息来更新我的列表集合视图。这一切都很好。
现在我需要使用此消息的字符串值传递到过滤器中。问题是我只能在 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);
}
您可以将谓词创建为 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;
}
我正在根据 viewModel 2 中数据网格的选择更改过滤 viewModel 1 中的 listcollectionview。为此,我使用 mvvm 消息传递。每次数据网格的选择发生变化时,都会发送一条消息来更新我的列表集合视图。这一切都很好。
现在我需要使用此消息的字符串值传递到过滤器中。问题是我只能在 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);
}
您可以将谓词创建为 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;
}