[英]Selected item ComboBox is not showing correct ID WPF
我有一個我無法解決的問題。
外殼視圖模型
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>());
}
菜單視圖模型
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));
}
}
校正視圖模型
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; }
}
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.