MVVM 可编辑组合框绑定 [英] MVVM Editable ComboBox Bindings

查看:26
本文介绍了MVVM 可编辑组合框绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Here's my issue...I have a list of servers, each with an ID and ServerName. I want to be able to select a server from the ComboBox and edit it in place, then have its ID available to update via SQL later. So let's say this is the data: (ID=1, Name="Server1"), (ID=2, Name="Server2"), (ID=3, Name="Server3"). If I select Server3 from the ComboBox, I'd like to edit it to be "Server4" then upload that with a SQL query (I know how to do this part). I'm utilizing MVVM, so all the values are properties of my ViewModel.

目前,当 ComboBox 中的文本字段被修改时,SelectedServer 立即变为 null,大概是因为它不再是它识别的值.我可以使用一些关于如何让它做我想做的事情的指导.

Currently, when the text field is modified in the ComboBox the SelectedServer immediately becomes null, presumably because it is no longer a value it recognizes. I could use some guidance on how to get this to do what I'm trying to do.

<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相关的代码:

And ViewModel relevant code:

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));
        }
    }
}

推荐答案

将EditedServerName"之类的属性绑定到 Combobox.Text.更改EditedServerName"后,您可以将值设置为 SelectedServer 的ServerName".

Bind a property like "EditedServerName" to Combobox.Text. When the "EditedServerName" is changed you can set the value to the "ServerName" of your 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}"
/>

这篇关于MVVM 可编辑组合框绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆