WPF Combobox绑定和SelectedValue与SelectedValuePath

我真的很困惑数据绑定和MVVM方法,尽管我喜欢我只是在挣扎的概念。 我创建了一个WPF,它有多个组合框和一个按钮。 第一个组合框将列出数据库实例名称。 点击按钮后将填充剩余的组合框。 由于我遇到第一个问题,数据库实例,combobox,我只会显示我的代码。 当应用程序启动时,加载组合框并按预期选择第一个项目。 问题是当我选择一个新名称时,我希望被调用的方法不会。 有人可以帮助我理解为什么我的方法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-conversionmun2012ci" });
        dbInstances.Add(new DBInstance { DBInstanceName = "fal-conversionmun2014ci" });

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

        }
    }
}
}

这是我的模型代码。 当我通过代码这个方法,公共字符串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));
        }
    }
}

你应该在绑定SelectedItem的物业ComboBoxSelectedDBInstance财产和摆脱的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
}
链接地址: http://www.djcxy.com/p/44625.html

上一篇: WPF Combobox binding and SelectedValue with SelectedValuePath

下一篇: How to bind a child user control's data context in the parent