我正在嘗試在 UWP 中實作多選串列視圖,同時盡可能接近 MVVM 模型。我的問題是我無法通過系結獲取視圖模型中的選定專案。
查看關于 SO 的其他答案,我發現實作此目的的唯一可能方法是通過 my 的CommandandCommandParameter欄位進行系結ListView。然而,答案通常要么集中在簡單的代碼隱藏方法上,要么是使用 WPF 制作的,這導致我被困在執行命令上。
在我的 MWE 之前的簡短說明:該程式將 .pdf 檔案作為輸入,并通過將每個頁面轉換為 .pdf 檔案來顯示它BitmapImage。我想要的是選擇這些單個頁面(BitmapImages)并對所有選定的專案執行一個操作(在這種情況下是不同的操作;但是,我的 MWE 只包含一個按鈕)。我正在嘗試在 UWP 中實作多選串列視圖,同時盡可能接近 MVVM 模型。我的問題是我無法通過系結獲取視圖模型中的選定專案。
這是我的 MWE:
模型
public class PdfPageModel
{
public string Title { get; set; }
public PdfDocument PdfDoc { get; set; }
public PdfPageModel(string Title, PdfDocument pdfdoc)
{
this.Title = Title;
this.PdfDoc = pdfdoc;
}
看法
<ListView
x:Name="PdfPageViewer"
CanReorderItems="True" AllowDrop="True" CanDragItems="True"
ItemsSource="{x:Bind ViewModel.PdfPages}"
IsItemClickEnabled="True"
SelectionMode="Multiple"
IsMultiSelectCheckBoxEnabled="False"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.IsHorizontalRailEnabled="True"
ScrollViewer.ZoomMode="Enabled"
IsZoomedInView="False"
>
<ListView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding }"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
Orientation="Horizontal">
</StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
<Button
CommandParameter="{Binding SelectedItems, Mode=OneWay, ElementName=PdfPageViewer}"
Command="{x:Bind ViewModel.SelectedPagesCommand}"
/>
視圖模型
public ObservableCollection<BitmapImage> PdfPages { get; set; }
private ICommand _selectedPagesCommand;
public ICommand SelectedPagesCommand
{
get
{
if (_selectedPagesCommand == null)
{
_selectedPagesCommand = new RelayCommand<?>(async () =>
{
// ??
});
}
return _selectedPagesCommand;
}
}
uj5u.com熱心網友回復:
我終于找到了如何實作這一目標。對于任何好奇或偶然發現這個問題的人,這就是我所做的。
我找到了這個執行緒,它幾乎解決了我試圖做的事情。
OP 實作了一個轉換器(見下文)以從串列中獲取所有選定的專案作為一個ListView元素。從檔案中,我了解到該SelectedItems屬性的回傳型別是List介面IList<>,我在我的SelectedPagesCommand.
然后,他們在命令呼叫中使用了這個轉換器。(請注意這里的SelectedItems呼叫已被洗掉,因為由于使用了轉換器而不再需要它。這是一個必要且重要的步驟。)有了這個,我終于能夠在串列中獲取選定的元素。回傳的元素是 type System.__ComObject,而不是預期的。不過,這很容易繞過;只需將型別轉換為應有的型別(在我的情況下,它是一個簡單的BitmapImage)。
轉換器
public class ListViewSelectedItemsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var listView = value as ListView;
return listView.SelectedItems;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
看法
<Page.Resources>
<helper:ListViewSelectedItemsConverter x:Key="ListViewSelectedItemsConverter"/>
</Page.Resources>
<!-- ... -->
<ListView
x:Name="PdfPageViewer"
CanReorderItems="True" AllowDrop="True" CanDragItems="True"
ItemsSource="{x:Bind ViewModel.PdfPages}"
IsItemClickEnabled="True"
SelectionMode="Multiple"
IsMultiSelectCheckBoxEnabled="False"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.IsHorizontalRailEnabled="True"
ScrollViewer.ZoomMode="Enabled"
IsZoomedInView="False"
>
<ListView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding }"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
Orientation="Horizontal">
</StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
<Button
CommandParameter="{Binding ElementName=PdfPageViewer, Converter={StaticResource ListViewSelectedItemsConverter}}"
Command="{x:Bind ViewModel.SelectedPagesCommand}"
/>
視圖模型
public ObservableCollection<BitmapImage> PdfPages { get; set; }
private ObservableCollection<BitmapImage> _selectedPdfPages;
public ObservableCollection<BitmapImage> SelectedPdfPages { get; set; }
private ICommand _selectedPagesCommand;
public ICommand SelectedPagesCommand
{
get
{
if (_selectedPagesCommand == null)
{
_selectedPagesCommand = new RelayCommand<IList<object>>(async param =>
{
foreach (var i in param)
{
var img = i as BitmapImage;
SelectedPdfPages.Add(img);
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511551.html
標籤:C#列表显示虚拟机uwp
