【发布时间】:2018-05-09 14:05:22
【问题描述】:
我正在尝试在 WPF 中实现一种方法,让用户在一个框中选择多个项目,然后通过按钮单击将这些选定的项目添加到另一个框中。
我正在尝试使用最少的代码来遵守 MVVM。我发现的解决方案显示 DataContext 正在通过我试图避免的 View 代码进行操作。
我认为我的问题是我不知道如何从 xaml 切换 IsSelected,但不确定。
XAML
<ListView
ItemsSource="{Binding AvailableStates, Mode=TwoWay}"
SelectedItem="{Binding SelectedStates, Mode=TwoWay}"
SelectionMode="Multiple"
DisplayMemberPath="state"
Grid.Row="1"
Margin="5"
Grid.Column="1"
Height="125"
Name="lvAvailableStates"
Grid.RowSpan="6"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.CanContentScroll="True">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
<Button
Grid.Row="2"
Grid.Column="2"
Margin="10"
Command="{Binding AddSelectedStatesCommand}"
Content=">>" />
视图模型
private ObservableCollection<SelectableItemWrapper<states_approved>> _selectedStates;
public ObservableCollection<SelectableItemWrapper<states_approved>> SelectedStates
{
get { return _selectedStates; }
set
{
_selectedStates = value;
OnPropertyChanged();
}
}
private void AddSelectedStates(object obj)
{
var selected = SelectedStates.Where(s => s.IsSelected)
.Select(s => s.Item)
.ToList();
StatesApproved = selected;
}
public CustomCommand AddSelectedStatesCommand
{
get
{
return new CustomCommand(AddSelectedStates, CanExecute);
}
}
选定的项目包装器
public class SelectableItemWrapper<T>
{
public bool IsSelected { get; set; }
public T Item { get; set; }
}
【问题讨论】:
-
你的问题有点不清楚。你的实际问题是什么?您发布的示例标记中只有 ListView。应该如何调用 AddSelectedStates 方法?
-
点击带有 >> 的按钮。即,用户在左侧列表视图中选择 3 个状态,单击 >> 按钮,然后填充右侧列表视图。我也会添加按钮代码。