我遇到了一个问题,即从 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 使用时非常奇怪的意外行为。
TLDR:设置
<ComboBox IsSynchronizedWithCurrentItem="false" ../>
要解释这个问题,需要知道WPF显示列表时会有一个与列表相关的
CollectionViewSource
对象。
显示的项目来自 CollectionViewSource.View
属性(ICollectionView
类型)。
IsSynchronizedWithCurrentItem
的Selector
(ComboBox
的父类型)将使选择器默认将所选项目同步到ICollectionView.CurrentItem
属性(当null
时)。
如果
ICollectionView.CurrentItem
更改,所有具有 Selector
默认或 true 且与相同 IsSynchronizedWithCurrentItem
相关的 ICollectionView
将同步选择。所以你的疑问就出现了。