【问题标题】:MVVM Editable ComboBox BindingsMVVM 可编辑组合框绑定
【发布时间】:2016-09-13 21:15:23
【问题描述】:

这是我的问题...我有一个服务器列表,每个服务器都有一个 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));
        }
    }
}

【问题讨论】:

    标签: c# wpf xaml mvvm combobox


    【解决方案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}"
    />
    

    【讨论】:

      【解决方案2】:

      ComboBox 主要用于选择。您可以使用其他控件(如 datagrid 等)来实现更新功能。

      好吧,如果你想以 ComboBox 的方式来做,我建议你在组合框下方放置几个文本框,并将这些文本框的内容绑定到 SelectedServer 属性,即

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

      等等。

      因此,一旦选择了服务器,这些文本框将填充当前所选服务器的值。然后,您可以使用这些框下方的按钮触发一些命令,该按钮触发 sql 查询并使用文本框中的绑定属性传递所需的数据。

      我希望你明白了。

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 2018-06-12
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 2015-07-11
        • 2015-04-27
        • 2023-03-05
        相关资源
        最近更新 更多