c# - WPF Combobox 绑定(bind)和 SelectedValue 与 SelectedValuePath

标签 c# wpf mvvm selectedvalue

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

这是我的数据库实例组合框的 XAML。我在这里遇到的一个问题是“值”fpr SelectedValuePath,如果我将它更改为“DBInstanceName”,它就不起作用。

 <ComboBox x:Name="cbxRLFDBInstances" ItemsSource="{Binding DBInstances}" 
                  SelectedValue="{Binding SelectedDBInstance, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                  SelectedValuePath="value" DisplayMemberPath="DBInstanceName"/>

这是我的 ViewModel 代码:

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

        }
    }
}
}

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

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

最佳答案

您应该将 ComboBoxSelectedItem 属性绑定(bind)到 SelectedDBInstance 属性并去掉 SelectedValuePath :

<ComboBox x:Name="cbxRLFDBInstances" ItemsSource="{Binding DBInstances}" 
              SelectedItem="{Binding SelectedDBInstance, UpdateSourceTrigger=PropertyChanged}" 
              DisplayMemberPath="DBInstanceName"/>

SelectedValuePath 属性仅在您想要绑定(bind)到与 ItemsSource 集合中的项目类型不同的源属性时使用。

要最初选择一个项目,您应该将 SelectedDBInstance 属性设置为存在于 DBInstances 集合中的项目:

public RLFDatabaseTableViewModel()
{
    LoadDBInstances();
    LoadDBInfoCommand = new RelayCommand(LoadDBInfo);
    SelectedDBInstance = DBInstances[0]; //selected the first item
}

关于c# - WPF Combobox 绑定(bind)和 SelectedValue 与 SelectedValuePath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009152/

相关文章:

c# - Win Forms UserControl 未检测到按键

c# - 从 URL 获取图像但未完全加载

c# - 导致 xamDataGrid 重新绘制

c# - 从我的 Web 服务读取 Http POST 正文内容? (.net 3.5)

c# - 从行中的链接获取 gridview 行详细信息

c# - 绑定(bind)到 WPF 中的设计数据

WPF 编程方法论

c# - 如何使用 MVVM 在 WPF 应用程序中访问另一个 ViewModel 中的一个 ViewModel 对象

c# - 处理 ViewModel/Model 中的致命异常

c# - 谁可以访问 MVVM 模式中的数据库