问题描述
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显示错误的项目。
解决方法
这些方法看起来坏了,让我们修复
public IDModel SelectedID
{
get => _selectedID;
set
{
_selectedID = value;
NotifyOfPropertyChange(() => SelectedID);
}
}
public void Handle(IDEvent message)
{
SelectedID = IDs?.FirstOrDefault(x => x.ID == message.IDModel.ID);
}