여기 내 문제가 있습니다 ... 각각 ID와 ServerName이있는 서버 목록이 있습니다. ComboBox에서 서버를 선택하고 제 위치에서 편집 한 다음 나중에 SQL을 통해 업데이트 할 수있는 ID를 가질 수 있기를 원합니다. 데이터 (ID = 1, Name = "Server1"), (ID = 2, Name = "Server2"), (ID = 3, Name = "Server3")라고합시다. ComboBox에서 Server3을 선택하면 "Server4"가되도록 편집 한 다음 SQL 쿼리 (이 부분을 수행하는 방법을 알고 있음)로 업로드하고 싶습니다. MVVM을 사용하고 있으므로 모든 값은 ViewModel의 속성입니다.MVVM 편집 가능 콤보 상자 바인딩
현재 ComboBox에서 텍스트 필드가 수정되면 SelectedServer는 더 이상 인식 할 수없는 값이기 때문에 즉시 null이됩니다. 이 일을 내가 어떻게하려고하는지에 대한 지침을 사용할 수 있습니다.
<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}"
/>
그리고 뷰 모델 관련 코드 :
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));
}
}
}