Вот моя проблема ... У меня есть список серверов, каждый с идентификатором и ServerName. Я хочу иметь возможность выбирать сервер из ComboBox и редактировать его на месте, а затем обновлять его идентификатор через SQL позже. Итак, допустим, это данные: (ID = 1, Name = "Server1"), (ID = 2, Name = "Server2"), (ID = 3, Name = "Server3"). Если я выберу Server3 из ComboBox, я бы хотел отредактировать его как «Server4», а затем загрузить его с помощью SQL-запроса (я знаю, как сделать эту часть). Я использую MVVM, поэтому все значения являются свойствами моего ViewModel.MVVM Editable ComboBox Bindings
В настоящее время, когда текстовое поле изменяется в ComboBox, SelectedServer сразу становится нулевым, по-видимому, потому, что он больше не является признанным значением. Я мог бы использовать некоторые рекомендации о том, как заставить это делать то, что я пытаюсь сделать.
<ComboBox Grid.Column="1" x:Name="serverNameUpdateBox" HorizontalAlignment="Stretch" Height="23" VerticalAlignment="Center" IsEditable="True"
ItemsSource="{Binding Path=DataContext.SelectedProjectServers, ElementName=main}"
DisplayMemberPath="ServerName"
SelectedValue="{Binding SelectedServer}"
SelectedValuePath="ServerName"
Text="{Binding SelectedServer.ServerName, UpdateSourceTrigger=LostFocus}"
/>
И ViewModel соответствующий код:
namespace ViewModel
{
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
SelectedProjectServers = new List<Server>();
SelectedServer = new Server();
private Server _selectedServer;
public Server SelectedServer
{
get { return _selectedServer; }
set
{
if (value == null) { ModifiedServer = _selectedServer; }
_selectedServer = value;
RaisePropertyChanged("SelectedServer");
}
}
private List<Server> _selectedProjectServers;
public List<Server> SelectedProjectServers
{
get { return _selectedProjectServers; }
set
{
_selectedProjectServers = value;
RaisePropertyChanged();
}
}
}
}
}
и модель соответствующий код:
namespace Model
{
public class Server : INotifyPropertyChanged
{
private string _serverName;
public string ServerName
{
get { return _serverName; }
set
{
_serverName = value;
RaisePropertyChanged();
}
}
private int _serverID;
public int ServerID
{
get { return _serverID; }
set
{
_serverID = value;
RaisePropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged([CallerMemberName] string caller = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
}
}
}