ItemsControl 包含 ItemTemplate 中绑定的 ComboBox(带有 Caliburn.Micro 的 WPF MVVM)

问题描述 投票:0回答:1

我遇到了一个问题,即从 ItemTemplate 中绑定的组合框列表中选择单个组合框中的一项。当我在其中选择一个值时,该值会在所有值中更新。它类似于这个问题在此处输入链接描述但我无法得到我所缺少的内容。 有人可以帮忙吗?

如果需要更多代码进行澄清,请询问:) 谢谢!

项目控制:

<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto"
          VerticalScrollBarVisibility="Auto">
<ItemsControl x:Name="InputsList"
              Margin="15 10 10 5">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Components:InputUCView/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

用户控件(带组合框)

<ComboBox x:Name="PdfListCombo"
      Style="{DynamicResource conditionalComboBox}"
      Grid.Column="1" Grid.Row="0"
      Margin="2 5 5 2" Text="Select pdf"
      ItemsSource="{Binding RelativeSource={
                RelativeSource AncestorType={
                x:Type ItemsControl}},
                Path=DataContext.PdfListCombo}"
      SelectedItem="{Binding RelativeSource={
                RelativeSource AncestorType={
                x:Type ItemsControl}},
                Path=DataContext.SelectedPdfName, Mode=TwoWay}"/>

来自 ViewModel 的有问题的部分

private BindableCollection<InputModel> _inputsList;

public BindableCollection<InputModel> InputsList
{
   get
     {
    
       _inputsList = new(inputsList);
       return _inputsList;
     }
  set
    {
      _inputsList = value;
      NotifyOfPropertyChange(() => InputsList);
    }
  }


    private BindableCollection<string> _pdfListCombo;

    public BindableCollection<string> PdfListCombo
    {
        get
        {
            //_pdfListCombo ??= new();
            foreach (var item in inputsList)
            {
                List<string> pdfFiles = new();
                foreach (var pdf in item.PdfNames)
                {
                    pdfFiles.Add(Path.GetFileName(pdf));
                }
                _pdfListCombo=new(pdfFiles);
            }
            return _pdfListCombo;
        }
        set
        {
            _pdfListCombo = value;
            NotifyOfPropertyChange(() => PdfListCombo);
        }
    }

    private string _selectedPdfName;

    public string SelectedPdfName
    {
        get
        {
            return _selectedPdfName;
        }
        set
        {
            _selectedPdfName = value;
            NotifyOfPropertyChange(() => SelectedPdfName);
        }
    }
wpf mvvm combobox caliburn.micro itemscontrol
1个回答
0
投票

这是 WPF 使用时非常奇怪的意外行为。
TLDR:设置

<ComboBox IsSynchronizedWithCurrentItem="false" ../>

要解释这个问题,需要知道WPF显示列表时会有一个与列表相关的

CollectionViewSource
对象。 显示的项目来自
CollectionViewSource.View
属性(
ICollectionView
类型)。
IsSynchronizedWithCurrentItem
Selector
ComboBox
的父类型)将使选择器默认将所选项目同步到
ICollectionView.CurrentItem
属性(当
null
时)。

如果

ICollectionView.CurrentItem
更改,所有具有
Selector
默认或 true 且与相同
IsSynchronizedWithCurrentItem
相关的
ICollectionView
将同步选择。所以你的疑问就出现了。

© www.soinside.com 2019 - 2024. All rights reserved.