2016-09-13 3 views
1

여기 내 문제가 있습니다 ... 각각 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)); 
     } 
    } 
} 

답변

1

"EditedServerName"과 같은 속성을 Combobox.Text에 바인딩합니다. "EditedServerName"이 변경되면 SelectedServer의 "ServerName"값을 설정할 수 있습니다.

<ComboBox Grid.Column="1" x:Name= "serverNameUpdateBox" HorizontalAlignment= "Stretch" Height= "23" VerticalAlignment= "Center" IsEditable= "True" 
ItemsSource= "{Binding Path=DataContext.SelectedProjectServers, ElementName=main}" 
DisplayMemberPath= "ServerName" 
SelectedItem="{Binding SelectedServer}" 
Text= "{Binding EditedServerName, UpdateSourceTrigger=LostFocus}" 
/> 
1

콤보 상자가 주로 선택하는 데 사용됩니다. uddate 기능을 위해 dtagrid와 같은 다른 컨트롤을 사용했을 수도 있습니다.

글쎄, 당신이 그것을 콤보 방식을 수행하려는 경우, 난 당신이 콤보 상자 아래에 텍스트 상자의 몇 가지를 타고 SelectedServer의 속성이 텍스트 상자의 컨텐츠를 결합

<TextBox x:name="ServerName" Text ={Binding SelectedServer.ServerName} /> 

등을 즉 제안 에.

따라서 서버를 선택하면이 텍스트 상자는 현재 선택된 서버의 값으로 채워집니다. 그런 다음이 상자 아래의 단추를 사용하여 일부 명령을 트리거 할 수 있습니다.이 단추는 SQL 쿼리를 트리거하고 텍스트 상자의 바운드 속성을 사용하여 필요한 데이터를 전달합니다.

아이디어를 얻길 바랍니다.