c# - 所选项目ComboBox没有显示正确的ID WPF

标签 c# wpf mvvm caliburn.micro

我有一个无法解决的问题。
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);
    }
ID模型库
public class IDModel
{
    public int ID { get; set; }
    public string IZVOR { get; set; }
}
ID事件
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显示错误的项目。

最佳答案

这些方法看起来坏了,让我们修复

public IDModel SelectedID
{
    get => _selectedID;
    set
    {
        _selectedID = value;
        NotifyOfPropertyChange(() => SelectedID);   
    }
}

public void Handle(IDEvent message)
{
    SelectedID = IDs?.FirstOrDefault(x => x.ID == message.IDModel.ID);
}

关于c# - 所选项目ComboBox没有显示正确的ID WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63529937/

相关文章:

c# - 从 DependencyProperty PropertyChangedCallback 获取父对象

c# - 使用切换按钮创建选择器

c# - 在 Visual Studio 中使用 WPF 时,如何使 List<Object> 变量出现在 DataBinding UI 中?

c# - 使用 GZipStream 压缩位图

c# - MVC - 将发布数据插入数据库

c# - 调用 EnvDTE80.ErrorItems.item() 时获取 "Index was outside the bounds of the array."

c# - MVVM Light EventToCommand - 无法触发事件

c# - 如何从 xaml 中引用 .resx 文件中的图标?

WPF PRISM - 在不解析实例的情况下向区域注册 View

c# - 从其他ViewModel调用方法