所选项目 ComboBox 未显示正确的 ID WPF
Posted
技术标签:
【中文标题】所选项目 ComboBox 未显示正确的 ID WPF【英文标题】:Selected item ComboBox is not showing correct ID WPF 【发布时间】:2020-12-11 06:11:27 【问题描述】:我有一个无法解决的问题。
ShellViewModel
private IEventAggregator _events;
private SimpleContainer _container;
public ShellViewModel(IEventAggregator events, SimpleContainer container)
_events = events;
_events.Subscribe(this);
_container = container;
void IHandle<CorrectionEvent>.Handle(CorrectionEvent message)
ActivateItem(_container.GetInstance<CorrectionViewModel>());
MenuViewModel
private IEventAggregator _events;
private IUserModel _userModel;
private IDModel _selectOdprto;
public BindableCollection<IDModel> Odprto get; set;
public MenuViewModel(IEventAggregator events , IUserModel userModel)
_events = events;
_userModel = userModel;
Task.Run(() => Data());
public async Task Data()
DataAccessLibrary da = new DataAccessLibrary();
Odprto = new BindableCollection<IDModel>(await da.GetData(_userModel.UserName, "Odprto"));
public IDModel SelectOdprto
get return _selectOdprto;
set
_selectOdprto = value;
_events.PublishOnUIThread(new CorrectionEvent());
_events.PublishOnUIThread(new IDEvent(_selectOdprto.ID , _selectOdprto));
CorrectionViewModel
private IDModel _selectedID;
private IDataAccess _dataAccess;
private IEventAggregator _events;
private IUserModel _userModel;
public int IDOdprto get; set;
public BindableCollection<IDModel> IDs get; set;
public CorrectionViewModel(IDataAccess dataAccess, IEventAggregator events, IUserModel userModel)
_dataAccess = dataAccess;
_userModel = userModel;
Task.Run(() => Data());
_events = events;
_events.Subscribe(this);
public async Task Data()
DataAccessLibrary da = new DataAccessLibrary();
IDs = new BindableCollection<IDModel>(await da.GetData(_userModel.UserName, "Odprto"));
NotifyOfPropertyChange(() => IDs);
public IDModel SelectedID
get return _selectedID;
set
SelectedID = message.IDModel;
SelectedID.ID = message.IDMenu;
NotifyOfPropertyChange(() => SelectedID);
public void Handle(IDEvent message)
_selectedID= message.IDModel;
NotifyOfPropertyChange(() => SelectedID);
IDModel 库
public class IDModel
public int ID get; set;
public string IZVOR get; set;
IDEvent
public class IDEvent
public IDEvent(int _IDMenu , IDModel T)
IDMenu = _IDMenu;
IDModel = T;
public int IDMenu get; private set;
public IDModel IDModel get; private set;
更正 XAML
<ComboBox Grid.Column="1" Grid.Row="1" IsSynchronizedWithCurrentItem="True"
ItemsSource="Binding IDs" MinWidth="200"
SelectedItem="Binding SelectedID, Mode=TwoWay" Margin="5"
HorizontalAlignment="Left" materialDesign:HintAssist.Hint="Izberite ID"
Style="StaticResource MaterialDesignFloatingHintComboBox" >
<ComboBox.ItemTemplate>
<DataTemplate>
<ComboBoxItem Content="Binding ID" HorizontalAlignment="Center" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
菜单 XAML
<ListBox Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" Grid.RowSpan="2" MinHeight="200"
MinWidth="200" MaxHeight="300" ItemsSource="Binding Odprto" HorizontalAlignment="Left"
BorderBrush="Black" BorderThickness="1" Margin="10" SelectedItem="Binding SelectOdprto">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding ID" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
所以代码有效,但问题是 ComboBox 显示的是第一项,而不是与事件一起传递的项。其他 TextBlocks 显示正确的值,如果我这样做 MessageBox.Show(SelectedID.ID.ToString());值是正确的,只是 ComboBox 显示了错误的项目。
【问题讨论】:
只是一个错字:SelectedID = message.IDModel;
=> _selectedID = message.IDModel;
这不起作用。 :/我已经试过了。它仍然选择第一个项目。
该行可能会导致***Exception
,因为setter 会调用自己。它必须被修复。请使用此修复程序更新代码。
已更改。你还有什么想法可以解决吗?
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
【参考方案1】:
这些方法看起来坏了,让我们修复
public IDModel SelectedID
get => _selectedID;
set
_selectedID = value;
NotifyOfPropertyChange(() => SelectedID);
public void Handle(IDEvent message)
SelectedID = IDs?.FirstOrDefault(x => x.ID == message.IDModel.ID);
【讨论】:
x 应该是什么? x 是IDs
集合的元素。答案有错别字,已修复。所以,这个表达式只是从集合中选择一个具有相同IDModel.ID
的元素,如果没有找到则返回null
。
SelectedID = IDs.FirstOrDefault(_selectedID => _selectedID.ID == message.IDModel.ID);
所以这行得通。谢谢。我希望这是正确的
@Zigimun x
在这里没问题,改回来。它是局部变量。 FirstOrDefault(blabla => blabla.ID == message.IDModel.ID);
也可以。
我改回来了。我现在知道了。将答案标记为已接受。非常感谢以上是关于所选项目 ComboBox 未显示正确的 ID WPF的主要内容,如果未能解决你的问题,请参考以下文章
WPF ComboBox 绑定到不显示所选项目文本的用户控件集合
如何在 QML 的自定义 ComboBox 中突出显示所选项目?
WPF ComboBox 与对象列表绑定,在所选项目中显示的值比在项目列表中显示的值更少