所选项目 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 =&gt; _selectedID.ID == message.IDModel.ID); 所以这行得通。谢谢。我希望这是正确的 @Zigimun x 在这里没问题,改回来。它是局部变量。 FirstOrDefault(blabla =&gt; blabla.ID == message.IDModel.ID); 也可以。 我改回来了。我现在知道了。将答案标记为已接受。非常感谢

以上是关于所选项目 ComboBox 未显示正确的 ID WPF的主要内容,如果未能解决你的问题,请参考以下文章

WPF ComboBox 绑定到不显示所选项目文本的用户控件集合

如何在 QML 的自定义 ComboBox 中突出显示所选项目?

WPF ComboBox 与对象列表绑定,在所选项目中显示的值比在项目列表中显示的值更少

选择后 ComboBox QML 不显示项目文本

Silverlight Combobox 将所选项目设置为 datagrid 的所选项目

如何在 WinForms 的 ComboBox 中居中对齐所选项目?