我正在使用 MVVM 方法使用 WPF C# 開發和應用程式。我有一個ListView(顯示檔案串列)SelectionMode設定為擴展;我正在嘗試獲取所選專案的名稱。我有一個命令SelectionChanged。該SelctionChanged事件的引數為(物件 xx)。在除錯中,我知道 xx 包含我需要的資訊,但是,我很難從 xx 中提取名稱。除錯告訴我 xx 是型別System.Windows.Control.SelectedItemCollection。我無法在我的視圖模型代碼中將變數設定為這種型別,因為這種型別是“受保護的”。我嘗試將其設定為鍵入FileModel但沒有成功。我想創建一個List<string>選定專案的名稱。任何建議都會非常受歡迎。
從視圖中提取:
<ListView x:Name="lvFiles" Grid.Row="4" Grid.Column="2" Margin="20,0,0,0"
SelectionMode="{Binding SelectMode}"
ItemsSource="{Binding SelectedItem.FileItems, ElementName=FolderView}" >
<ie1:Interaction.Triggers >
<ie1:EventTrigger EventName ="SelectionChanged" >
<ie1:InvokeCommandAction CommandParameter="{Binding ElementName=lvFiles, Path=SelectedItems}"
Command="{Binding SelectionChangedCommand}" />
</ie1:EventTrigger>
</ie1:Interaction.Triggers>
從 ViewModel 中提取:
private void NewSelectedItems(object xx)
{
var zz = xx.ToString();
//List<FileModel> sls = new List<FileModel>();
//SelectedFileList.Clear();
//foreach (var item in (List<FileModel>)xx)
//{
// SelectedFileList.Add(item.Name);
//}
}
uj5u.com熱心網友回復:
如果您不知道要正確轉換的型別,則必須查閱 .NET API 參考:單擊成員并按“F1”以允許 Visual Studio 在瀏覽器中打開成員檔案。
在這里,您將了解到這ListBox.SelectedItems是 type IList。在不查閱檔案的情況下,我們可以預期它SelectedItemCollection至少會實作IEnumerable.
或者,您始終可以檢查Type回傳的物件object.GetType():
Debug.WriteLine(xx.GetType().BaseType);
或者只是xx.GetType()在除錯會話期間進入即時視窗。
在這里,您將了解到基本型別SelectedItemCollection是ObservableCollection<object>.
IEnumerable是使用 列舉集合的最少需要的型別foreach。
然后,您可以將每個單獨的專案顯式轉換為其原始型別或使用 LINQ Enumerable.Cast<T>():
private void NewSelectedItems(object selectedItems)
{
IEnumerable<FileModel> selectedFileModels = selectedItems.Cast<FileModel>();
// In case SelectedFileList IS of type List<T>
IEnumerable<string> selectedFileModelNames = selectedFileModels.Select(fileModel => fileModel.Name);
SelectedFileList.AddRange(selectedFileModelNames);
// In case SelectedFileList IS NOT of type List<T>
foreach (FileModel selecteFileModel in selectedFileModels)
{
SelectedFileList.Add(selecteFileModel.Name);
}
}
uj5u.com熱心網友回復:
感謝 BionicCode 您的解決方案完全沒有用,它拒絕了這條線
IEnumerable<string> selectedFileModelNames = selectedFileModels.Select(fileModel => fileModel.Name);。
但是,它讓我開始尋找解決方案。代碼如下:
private void NewSelectedItems(ObservableCollection<Object> selectedItems)
{
IEnumerable<FileViewModel> selectedFileModels = selectedItems.Cast<FileViewModel>();
SelectedFileList.Clear();
SelectedFile = "";
for (int idx = 0; idx < selectedFileModels.Count(); idx )
{
SelectedFileList.Add(selectedFileModels.ElementAt<FileViewModel>(idx).Name);
}
SelectedFiles = string.Join(", ", SelectedFileList.ToArray());
OSDBM.FileNames = SelectedFileList.ToArray();
if (SelectedFileList.Count() == 1)
{
SelectedFile = SelectedFileList[0];
OSDBM.FileName = SelectedFile;
}
}
它現在可以按我的意愿作業,并簡化了我的代碼的其他部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422339.html
標籤:
上一篇:WPF按鈕多文本行訪問
