相关疑难解决方法(0)

使用MVVM管理多个选择

在我学习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属性?

.net c# data-binding mvvm

59
推荐指数
2
解决办法
5万
查看次数

如何将多个listview选项绑定到viewmodel?

我正在实现listview,旁边有一个按钮.我必须能够在列表视图中选择多个项目,然后单击按钮,然后将所选项目放入列表中.但我的问题是,如何将所选项目绑定到视图模型?我将selectionmode改为多个.但是,我必须这样做:

SelectedItem={Binding path= selectedItems}
Run Code Online (Sandbox Code Playgroud)

然后在我的viewmodel中创建一个selectedItems属性,它将设置我选择的这些项目?或者这样做的正确解决方案是什么?

wpf mvvm selection

35
推荐指数
5
解决办法
5万
查看次数

WPF ComboBox SelectedItem在TabControl Switch上设置为Null

我的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似乎不是正确的解决方案.任何人都可以在这种情况下摆脱一些吗?

编辑:设置器断点处的调用堆栈仅显示[外部代码] - 没有提示.

wpf xaml binding

18
推荐指数
2
解决办法
1万
查看次数

扩展选择模式,虚拟化和IsSelected绑定

在扩展选择模式下,IsSelected绑定似乎有问题。看起来只有选择中的最后一项超出了范围,才能正确处理。

示范:

项目012989796与选择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)

c# wpf virtualization mvvm selection

8
推荐指数
1
解决办法
928
查看次数

列表视图虚拟化并取消选择所有项目

在我的应用程序中,我有一个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)

c# wpf xaml listview

7
推荐指数
0
解决办法
1726
查看次数

WPF listview/gridview性能可怕,建议

我有一个窗口使用绑定到ObservableCollection的WPF ListView/GridView.表演完全可怕.每次添加/删除/修改项目时,应用程序都会尝试加载300-400项和CPU使用率峰值.分析没有揭示任何明显的东西.

有人有什么建议吗?

wpf performance listview gridview

6
推荐指数
3
解决办法
1万
查看次数

选择到ViewModel的WPF绑定不会设置未在列表中显示的项目

我有一个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

data-binding wpf binding listview mvvm

5
推荐指数
1
解决办法
4033
查看次数