所选项目 ComboBox 未显示正确的 ID WPF
Selected item ComboBox is not showing correct ID WPF
我有一个无法解决的问题。
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; }
}
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 显示的是第一个项目,而不是随事件传递的项目。其他 TextBlock 显示正确的值,如果我这样做 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);
}
我有一个无法解决的问题。
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; }
}
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 显示的是第一个项目,而不是随事件传递的项目。其他 TextBlock 显示正确的值,如果我这样做 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);
}