WPF MVVM列表框多选

gfttwv5a  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(241)

我已经创建了一个包含项目列表的列表框,我需要在选择更改(选择和取消选择)时绑定它们。
ABCD.xalm

<ListBox Grid.Column="2" Grid.ColumnSpan="9" Height="30" Margin="0 0 5 0" Foreground="{StaticResource AcresTheme}" SelectedItem="{Binding Path=UpdateSimulationItem,UpdateSourceTrigger=PropertyChanged}"                               
                            ItemsSource="{Binding SmulationTypes, NotifyOnSourceUpdated=True}" 
                            Background="{Binding }"
                            MinHeight="65" SelectionMode="Multiple">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <CheckBox  Foreground="{StaticResource AcresTheme}"
                                           Content="{Binding Item}" 
                                           IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"></CheckBox>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="{x:Type ListBoxItem}">
                                <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
                            </Style>
                        </ListBox.ItemContainerStyle>
                    </ListBox>

biao c.cs(查看模型)

public List<string> SimulationTypesList { get; set; } = new List<string>();
    private ObservableCollection<SimulationType> _simulationTypes = new ObservableCollection<SimulationType>();

    public ObservableCollection<Items> SimulationTypes
    {
        get
        {
            return _simulationTypes;
        }
        set
        {
            _simulationTypes = value;
            OnPropertyChanged("SimulationTypes");
        }
    }

    private Items _updateSimulationItem;
    public Items UpdateSimulationItem
    {
        get
        {
            return _updateSimulationItem;
        }
        set
        {
          //Logic for getting the selected item
            _updateSimulationItem = value;
            OnPropertyChanged("UpdateSimulationItem");
        }
    }
public ABCD()
{
        SimulationTypes.Add(new SimulationType() { Item = "Simulation 1", IsSelected = false });
        SimulationTypes.Add(new SimulationType() { Item = "Simulation 2", IsSelected = false });
        SimulationTypes.Add(new SimulationType() { Item = "Simulation 3", IsSelected = false });
}

Items.cs

public class Items: ViewModelBase
{
    private string item;
    public string Item
    {
        get { return item; }
        set
        {
            item = value;
            this.OnPropertyChanged("Item");
        }
    } 
    
    private bool isSelected;
    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            this.OnPropertyChanged("IsSelected");
        }
    }
}

我确实尝试了https://stackoverflow.com/a/34632944/12020323中给出的解决方案,这对于删除单个项目或选择单个项目来说效果很好。
当我们选择第二项时,它不会触发属性更改。

ddrv8njm

ddrv8njm1#

错误不在此代码中。您可能对VM示例感到困惑。这是初学者经常遇到的情况。可能SimulationType的实现有问题。您没有显示它。
下面是一个完整的代码示例,演示了多选绑定是否正常工作。
第一个
也许您的意思是,在多重选择模式下,SelectedItem属性始终只有第一个被选择的项,直到取消选择它为止?
不幸的是,实现这样的任务并不容易,最好是定制一个AP属性,然后在XAML中使用。
第一次

k4aesqcs

k4aesqcs2#

谢谢你@EldHasp,花时间回答我的问题。非常感谢提供的解决方案。

目前我对ViewModel中的完整代码很感兴趣,我发现了我在ViewModel中所做的错误。
旧代码:

private ObservableCollection<SimulationType> _simulationTypes = new ObservableCollection<SimulationType>();

public ObservableCollection<Items> SimulationTypes
{
    get
    {
        return _simulationTypes;
    }
    set
    {
        _simulationTypes = value;
        OnPropertyChanged("SimulationTypes");
    }
}

private Items _updateSimulationItem;
public Items UpdateSimulationItem
{
    get
    {
        return _updateSimulationItem;
    }
    set
    {
        //Logic for getting the selected item
        _updateSimulationItem = value;
        OnPropertyChanged("UpdateSimulationItem");
    }
}

**_更新模拟项=值;**将第一个选定项绑定到UpdateSimulationItem,只有在更改特定项时才会触发propertychange。

例如:
添加新的模拟类型();添加新的模拟类型();添加新的模拟类型();
在这三个项目中,如果我选择Simulation 1,则UpdateSimulationItem将绑定到Simulation 1,并且propertychange将缩小到一个项目,即Simulation 1。现在,如果我们单击Simulation 2,则不会触发peopertychange,因为UpdateSimulationItem仅绑定到Simulation 1项目更改。
我所做的改变。
更新代码:

private Items _updateSimulationItem;
public Items UpdateSimulationItem
{
    get
    {
        return _updateSimulationItem;
    }
    set
    {
      //Removed unnecessary code and the assignment of value to _updateSimulationItem
      OnPropertyChanged("UpdateSimulationItem");
    }
}

因为我们已经将SimulationTypes绑定到ABC.XAML中的ItemSource,如下所示

<ListBox Foreground="{StaticResource AcresTheme}" 
         SelectedItem="{Binding Path=UpdateSimulationItem,UpdateSourceTrigger=PropertyChanged}" 
         ItemsSource="{Binding SimulationTypes, NotifyOnSourceUpdated=True}" 
         MinHeight="65" SelectionMode="Multiple">

当我点击视图中的复选框时,它会自动更新SimulationTypes,因为我已经将复选框绑定到IsSelected。

<CheckBox  Foreground="{StaticResource AcresTheme}"
           Content="{Binding Item}"
           IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

@EldHasp我们必须在您的代码中做的代码更改是删除setter属性中对_selectedItem的赋值,只保留OnPropertychange(nameOf(SelectedItem))
公共项目?选择的项目{ get =〉_selectedItem;设置=〉Set(引用所选项目,值);}粗体文本使SelectedItem绑定到一个项目,这在选择其他项目时限制触发器。
再次感谢您@EldHasp在此抽出时间。

相关问题