首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SelectedValuePath的WPF组合框绑定和SelectedValue

使用SelectedValuePath的WPF组合框绑定和SelectedValue
EN

Stack Overflow用户
提问于 2017-03-25 05:07:22
回答 1查看 10.4K关注 0票数 4

我真的在为数据绑定和MVVM方法论而苦苦挣扎,尽管我喜欢我正在苦苦挣扎的概念。我已经为它创建了一个有多个组合框和一个按钮的WPF。第一个组合框将列出数据库实例名称。单击按钮后,将填充其余的组合框。由于我遇到了第一个问题,数据库实例,combobox,我将只显示我的代码。当应用程序启动时,组合框被加载,并且第一项被选中,正如预期的那样。问题是,当我选择一个新名称时,我期望被调用的方法并没有被调用。有人能帮助我理解为什么当我的XAML,SelectedValue="{Binding SelectedDBInstance, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}中有这段代码时,我的方法public DBInstance SelectedDBInstance不能被执行吗?

下面是我的数据库实例组合框的XAML。我这里有一个问题是"value“fpr SelectedValuePath,如果我把它改成"DBInstanceName”,它就不能工作。

代码语言:javascript
复制
 <ComboBox x:Name="cbxRLFDBInstances" ItemsSource="{Binding DBInstances}" 
                  SelectedValue="{Binding SelectedDBInstance, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                  SelectedValuePath="value" DisplayMemberPath="DBInstanceName"/>

以下是我的ViewModel代码:

代码语言:javascript
复制
namespace DatabaseTest.ViewModel
{

class RLFDatabaseTableViewModel : INotifyPropertyChanged
{
    Utilities dbtUtilities = new Utilities();


    public RelayCommand LoadDBInfoCommand
    {
        get;
        set;
    }


    public RLFDatabaseTableViewModel()
    {
        LoadDBInstances();

        LoadDBInfoCommand = new RelayCommand(LoadDBInfo);
    }


    public ObservableCollection<DBInstance> DBInstances
    {
        get;
        set;
    }


    public void LoadDBInstances()
    {
        ObservableCollection<DBInstance> dbInstances = new ObservableCollection<DBInstance>();
        DataTable dt = SmoApplication.EnumAvailableSqlServers(false);

        dbInstances.Add(new DBInstance { DBInstanceName = "fal-conversion\\mun2012ci" });
        dbInstances.Add(new DBInstance { DBInstanceName = "fal-conversion\\mun2014ci" });

        if (dt.Rows.Count > 0)
        {
            foreach (DataRow dr in dt.Rows)
            {
                dbInstances.Add(new DBInstance { DBInstanceName = dr["Name"].ToString() });
            }
        }

        DBInstances = dbInstances;

    }


    private DBInstance _selectedDBInstance;


    public DBInstance SelectedDBInstance
    {
        get
        {
            return _selectedDBInstance;
        }

        set
        {
            _selectedDBInstance = value;
            RaisePropertyChanged("SelectedDBInstance");
            //ClearComboBoxes();

        }
    }
}
}

这是我的Model代码。当我单步执行代码时,这个方法public string DBInstanceName会被多次执行。我不知道为什么,这对我来说似乎是浪费。

代码语言:javascript
复制
namespace DatabaseTest.Model
{
public class RLFDatabaseTableModel { }


public class DBInstance : INotifyPropertyChanged
{
    private string strDBInstance;


    public override string ToString()
    {
        return strDBInstance;
    }


    public string DBInstanceName
    {
        get
        {
            return strDBInstance;
        }

        set
        {
            if (strDBInstance != value)
            {
                strDBInstance = value;
                RaisePropertyChanged("DBInstanceName");
            }
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-27 04:50:33

您应该将ComboBoxSelectedItem属性绑定到SelectedDBInstance属性,并删除SelectedValuePath

代码语言:javascript
复制
<ComboBox x:Name="cbxRLFDBInstances" ItemsSource="{Binding DBInstances}" 
              SelectedItem="{Binding SelectedDBInstance, UpdateSourceTrigger=PropertyChanged}" 
              DisplayMemberPath="DBInstanceName"/>

仅当要绑定到与ItemsSource集合中的项类型不同的源属性时,才使用SelectedValuePath属性。

若要最初选择项,应将SelectedDBInstance属性设置为DBInstances集合中存在的项:

代码语言:javascript
复制
public RLFDatabaseTableViewModel()
{
    LoadDBInstances();
    LoadDBInfoCommand = new RelayCommand(LoadDBInfo);
    SelectedDBInstance = DBInstances[0]; //selected the first item
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43009152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档