WPF组合框绑定和SelectedValue与SelectedValuePath

5

我对数据绑定和MVVM方法感到非常困惑,虽然我喜欢这个概念,但我仍然很困难。我创建了一个WPF,其中有多个组合框和一个按钮。第一个组合框将列出数据库实例名称。在点击按钮后,其余的组合框将被填充。由于我在第一个数据库实例组合框上遇到了问题,所以我只会展示我的代码。当应用程序启动时,组合框被加载,并选择了第一项,符合预期。问题是当我选择一个新名称时,我希望被调用的方法却没有被执行。有人能帮我理解为什么我的方法public DBInstance SelectedDBInstance没有在我的XAML中得到执行吗?SelectedValue="{Binding SelectedDBInstance, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

这是我的数据库实例组合框的XAML。我在这里有一个问题,就是SelectedValuePath的“value”,如果我将它更改为“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));
        }
    }
}

我只是尝试了所有我看到的。似乎没有什么起作用。 - Cass
尝试移除SelectedValuePath,看看会发生什么。 - Dakota Kronberger
我还没试过。我会尝试一下的。 - Cass
我将其从SelectedValue更改为SelectedItem,这现在导致SelectedDBInstance被调用,但是现在当应用程序启动时,我没有选择任何项目。我尝试了SelectIndex,但没有起作用。 - Cass
我有一个与此相关的问题。现在,我已经让数据库实例组合框工作了,我需要能够获取所选内容以加载下一个组合框。在加载了数据库实例类之后,我现在正在使用数据库名称类。我需要获取包含在数据库实例组合框中的数据库实例名称。我尝试过DBInstance dbInstanceName = new DBInstance();然后我做dbInstanceName = SelectedDBInstance,但SelectedDBInstance为空。我该如何使其工作? - Cass
显示剩余4条评论
1个回答

0

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

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

SelectedValuePath 属性仅在您想要绑定到源属性而该属性与 ItemsSource 集合中的项不是相同类型时使用。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接