在我学习MVVM的过程中,我已经建立了对WPF和ViewModel模式的一些基本理解.我在提供列表时使用以下抽象,并且对单个选定项目感兴趣.
public ObservableCollection<OrderViewModel> Orders { get; private set; }
public ICollectionView OrdersView
{
get
{
if( _ordersView == null )
_ordersView = CollectionViewSource.GetDefaultView( Orders );
return _ordersView;
}
}
private ICollectionView _ordersView;
public OrderViewModel CurrentOrder
{
get { return OrdersView.CurrentItem as OrderViewModel; }
set { OrdersView.MoveCurrentTo( value ); }
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以将OrdersView与支持排序和过滤绑定到WPF中的列表:
<ListView ItemsSource="{Binding Path=OrdersView}"
IsSynchronizedWithCurrentItem="True">
Run Code Online (Sandbox Code Playgroud)
这对单选视图非常有效.但我还想支持视图中的多个选择,并让模型绑定到所选项的列表.
如何将ListView.SelectedItems绑定到ViewModel上的backer属性?
我正在实现listview,旁边有一个按钮.我必须能够在列表视图中选择多个项目,然后单击按钮,然后将所选项目放入列表中.但我的问题是,如何将所选项目绑定到视图模型?我将selectionmode改为多个.但是,我必须这样做:
SelectedItem={Binding path= selectedItems}
Run Code Online (Sandbox Code Playgroud)
然后在我的viewmodel中创建一个selectedItems属性,它将设置我选择的这些项目?或者这样做的正确解决方案是什么?
我的WPF应用程序中遇到了一个简单的问题,让我在桌面上敲打我的脑袋.我有一个TabControl,其中每个TabItem都是使用类似于此的DataTemplate为ViewModel生成的视图:
<DataTemplate DataType="{x:Type vm:FooViewModel}">
<vw:FooView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
FooView包含一个ComboBox:
<ComboBox ItemsSource="{Binding Path=BarList}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedBar}"/>
Run Code Online (Sandbox Code Playgroud)
和FooViewModel包含一个简单的属性:public Bar SelectedBar { get; set; }.我的问题是,当我为我的ComboBox设置值时,更改为另一个选项卡,然后更改回来,ComboBox再次为空.如果我在我的属性的setter上设置断点,我看到null当我切换到另一个选项卡时该属性被分配给.
根据我的理解,当切换选项卡时,它将从VisualTree中删除 - 但为什么要将我的ViewModel属性设置为null?这使得我很难保持持久状态,并且检查value != null似乎不是正确的解决方案.任何人都可以在这种情况下摆脱一些吗?
编辑:设置器断点处的调用堆栈仅显示[外部代码] - 没有提示.
在扩展选择模式下,IsSelected绑定似乎有问题。看起来只有选择中的最后一项超出了范围,才能正确处理。
示范:
项目0,1,2和98,97,96与选择Control。选择94(无Control!)时,选择计数器应为1,但您会看到3。向上滚动将显示未选中范围中只有一个(最后一个)选择项。
以下是mcve:
xaml:
<ListBox ItemsSource="{Binding Items}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
CS:
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public class …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个listview,其项目容器样式绑定到我的视图模型上的IsSelected属性.
我还在listview上设置了一个inputbinding来处理以编程方式选择列表中的所有项目,因为默认情况下由于虚拟化堆栈面板不起作用.这很好用.
当用户按下CTRL + A后单击单个列表项时出现问题.用户应该期望发生的是单击的单个新项目成为唯一选择的项目.实际发生的是listview不会更新看不到的项目的IsSelected属性,只有当前可见的项目才会被取消选中.
我该如何正确处理这种行为?
<ListView
Name="sortList"
Grid.Row="1"
ItemsSource="{Binding RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type UserControl}},
Path=ItemsSource, Mode=TwoWay}">
<ListView.InputBindings>
<KeyBinding Gesture="CTRL+A" Command="{Binding SelectAllCommand}" />
</ListView.InputBindings>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Padding" Value="3" />
<Setter
Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
Run Code Online (Sandbox Code Playgroud)
这是select all命令.
private RelayCommand _selectAllCommand;
public System.Windows.Input.ICommand SelectAllCommand
{
get
{
if (_selectAllCommand == null)
_selectAllCommand = new RelayCommand(param => this.SelectAll());
return _selectAllCommand;
}
}
private void SelectAll()
{
foreach (object o in this.Objects)
if (!this.SelectedItems.Contains(order))
order.IsSelected = …Run Code Online (Sandbox Code Playgroud) 我有一个窗口使用绑定到ObservableCollection的WPF ListView/GridView.表演完全可怕.每次添加/删除/修改项目时,应用程序都会尝试加载300-400项和CPU使用率峰值.分析没有揭示任何明显的东西.
有人有什么建议吗?
我有一个ViewModel有一个IsSelected,我在我的绑定属性ListView.ItemContainerStyleXAML到IsSelected我的视图模型属性.
我打开应用程序并填充ListView了很多项目的视图模型集合(显示在我的视图中),比如大约2000.然后我选择列表中的所有内容Ctrl-A.我的视图模型集合IsSelected中的项目仅获取在中可见的项目的集合ListView.如果我在列表中向下翻页,IsSelected则会为显示的任何项目设置.如果我翻阅所有项目,那么我视图模型中的所有项目都将IsSelected属性设置为true.
这是我的XAML,用于IsSelected将列表视图中的视图绑定到我的视图模型:
<ListView Margin="5" ItemsSource="{Binding FilteredComparisonList}" x:Name="comparisonListView">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Source filename" DisplayMemberBinding="{Binding ImageFile.BaseFilename}" Width="Auto" />
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)
IsSelected当我选择所有项目时,为什么我的视图模型中的所有项目都设置为true ListView?