2016-09-13 6 views
1

Вот моя проблема ... У меня есть список серверов, каждый с идентификатором и 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)); 
     } 
    } 
} 

ответ

1

Связать свойство типа «EditedServerName» с Combobox.Text. Когда «EditedServerName» изменено, вы можете установить значение «ServerName» вашего 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" 
SelectedItem="{Binding SelectedServer}" 
Text= "{Binding EditedServerName, UpdateSourceTrigger=LostFocus}" 
/> 
1

Combo окно используется в основном для выбора. Возможно, вы использовали другой элемент управления, например dtagrid, для uddate.

Ну, если вы хотите сделать это ComboBox путь, я полагаю, что вы берете несколько текстовых полей ниже вашего комбинированного окна и связать эти содержимое текстовых полей к свойствам SelectedServer т.е.

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

и так на.

Таким образом, когда выбран сервер, эти текстовые поля будут заполнены значениями из выбранного сервера. И затем вы можете вызвать некоторую команду, используя кнопку ниже этих полей, которая запускает SQL-запрос и передает необходимые данные с использованием связанных свойств из текстовых полей.

Надеюсь, у вас есть идея.