【问题标题】:Binding some checkbox into combobox to a listView将一些复选框绑定到组合框到 listView
【发布时间】:2020-02-04 16:15:18
【问题描述】:

我有一个在组合框中显示的机构集合。其中一个属性是“IsSelected”,它允许我在一个组合框中选择多个项目。

        <ComboBox Name="CmbEtabTout" 
              ItemsSource="{Binding EtablissementsUtilisateur}"
              Grid.IsSharedSizeScope="True"
              Grid.Column="2" 
              Grid.ColumnSpan="3" 
              Grid.Row="2" 
              Height="25" 
              Width="250">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="30" />
                        <ColumnDefinition SharedSizeGroup="AgentA" Width="auto" />
                        <ColumnDefinition Width="5" />
                        <ColumnDefinition SharedSizeGroup="AgentB" Width="auto" />
                    </Grid.ColumnDefinitions>
                    <CheckBox IsChecked="{Binding IsSelected}" Grid.Column="0"/>
                    <TextBlock Text="{Binding IdEtablissement}" Grid.Column="1"/>
                    <TextBlock Text="{Binding Nom}" Grid.Column="3"/>
                </Grid>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <ListView x:Name="LVAgent"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ItemsSource="{Binding Agents}" Grid.ColumnSpan="2" Margin="150,0,42,0" Grid.Column="2" Grid.Row="4" Grid.RowSpan="5" >
        <ListView.View>
            <GridView>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding IsSelected}" 
                                              Command="{Binding DataContext.SelectAgentCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"
                                              CommandParameter="{Binding}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                    <CheckBox IsChecked="{Binding SelectAllAgents}"
                        IsEnabled="True"/>
                </GridViewColumn>
                <GridViewColumn Header="Matricule"
                    Width="110" 
                    DisplayMemberBinding="{Binding Matricule}"/>
                <GridViewColumn Header="Nom" 
                    Width="120"
                    DisplayMemberBinding="{Binding Nom}"/>
                <GridViewColumn Header="Prénom" 
                    Width="120" 
                    DisplayMemberBinding="{Binding Prenom}"/>

            </GridView>
        </ListView.View>
    </ListView>

我的组合框集合:

        private ObservableCollection<Etablissement> _EtablissementsUtilisateur;
    public ObservableCollection<Etablissement> EtablissementsUtilisateur
    {
        get
        {
            return _EtablissementsUtilisateur;
        }
        set
        {
            if (value != _EtablissementsUtilisateur)
            {
                _EtablissementsUtilisateur = value;
                RaisePropertyChanged(nameof(EtablissementsUtilisateur));
            }
        }
    }

我正在尝试找出如何绑定这些组合框以刷新列表:如果我选择三个机构,列表会显示这三个机构的代理。也许有命令?

     <CheckBox IsChecked="{Binding IsSelected}" Grid.Column="0"/>

看起来像这样:

由于我已经将我的复选框与“IsSelected”(用于 SelectAll)绑定,我不知道如何绑定以刷新后面的代理列表,当我检查时,无需按下“验证”之类的按钮。

编辑:我现在的问题是如果我想做这样的事情,例如:

       <CheckBox IsChecked="{Binding IsSelected}" Command="{Binding }" Grid.Column="0" />

我只能绑定到 Etablissement 类,而不能绑定到 ViewModel。 (因为我认为是组合框的 itemSource)

【问题讨论】:

    标签: c# mvvm combobox


    【解决方案1】:

    目标是,“当任何复选框被选中或未选中时,如果我选择三个机构,列表会显示这三个机构的代理”。

    "当任何复选框被选中或未选中时" => 属性更改事件处理程序

    "如果我选择三个机构" => if 语句

    "列表显示这三个机构的代理" => 方法调用

    假设 Etablissement : INotifyPropertyChanged,我们可以将事件处理程序添加到每个 Etablissement.PropertyChanged。另一种选择是将处理程序添加到 CheckBox.Checked 和 CheckBox.Unchecked。

    奖励:事件处理程序可以是异步的,因此如果“方法调用”是异步的,您就可以在家等待它,这意味着您的 UI 保持响应且不会锁定。

    我会在您的 UserControl 或 ComboBox 的 Loaded 事件中添加处理程序

    Loaded += delegate
    {
        PropertyChangedEventHandler propertyChanged = delegate
        {
            //if number of checked items != 3
                //return;
            //update agents
        };
        foreach (var etablissement in EtablissementsUtilisateur)
            etablissement.PropertyChanged += propertyChanged;
    }
    

    【讨论】:

    • "Etablissement : INotifyPropertyChanged" 是的。老实说,我理解你的意思,但我不确定如何将它放在 MVVM 中,在代码中而不是在代码后面。我会测试一下。
    猜你喜欢
    • 2022-01-11
    • 2014-03-20
    • 2016-08-23
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多