2016-09-13 134 views
1

这是我的问题...我有一个服务器列表,每个服务器都有一个ID和ServerName。我希望能够从ComboBox中选择一个服务器并对其进行编辑,然后让它的ID可用于稍后通过SQL进行更新。假设这是数据:(ID = 1,Name =“Server1”),(ID = 2,Name =“Server2”),(ID = 3,Name =“Server3”)。如果我从ComboBox中选择Server3,我想将其编辑为“Server4”,然后用SQL查询上传(我知道如何完成这部分)。我正在使用MVVM,所以所有的值都是我的ViewModel的属性。MVVM可编辑组合框绑定

当前,当在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}" 
          /> 

而且视图模型相关代码:

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查询并使用文本框中的绑定属性传递所需的数据。

我希望你明白了。