这是我的问题......我有一个服务器列表,每个服务器都有一个ID和ServerName。我希望能够从ComboBox中选择一个服务器并在适当的位置进行编辑,然后让它的ID可以通过SQL更新。所以,让我们说这是数据:( ID = 1,Name =" Server1"),(ID = 2,Name =" Server2"),(ID = 3 ,Name =" Server3")。如果我从ComboBox中选择Server3,我想将其编辑为" Server4"然后用SQL查询上传(我知道如何做这部分)。我正在使用MVVM,因此所有值都是我的ViewModel的属性。
目前,当在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}"
/>
与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));
}
}
}
答案 0 :(得分:3)
绑定类似&#34; EditedServerName&#34;到Combobox.Text。 当&#34; EditedServerName&#34;更改后,您可以将值设置为&#34; ServerName&#34;你的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 :(得分:1)
ComboBox主要用于选择。你可以使用像datagrid这样的另一个控件来实现更新功能。
好吧,如果您想以ComboBox的方式进行,我建议您在组合框下面放置几个文本框,并将这些文本框内容绑定到SelectedServer属性,即
<TextBox x:name="ServerName" Text ={Binding SelectedServer.ServerName} />
等等。
因此,当选择服务器时,这些文本框将填充当前所选服务器的值。然后,您可以使用这些框下方的按钮触发某些命令,这会触发sql查询并使用文本框中的绑定属性传递所需的数据。
我希望你明白了。