我真的很挣扎于数据绑定和MVVM方法论,尽管我喜欢我正在努力的概念。我创建了一个WPF,它有多个组合框和一个按钮。第一个组合框将列出数据库实例名称。单击按钮后将填充剩余的组合框。由于我遇到了第一个数据库实例的问题,因此组合框我只会显示我的代码。当应用程序启动时,加载组合框并按预期选择第一个项目。问题是,当我选择一个新名称时,我希望调用的方法不会。有人可以帮助我理解为什么我的方法public DBInstance SelectedDBInstance
在我的XAML SelectedValue="{Binding SelectedDBInstance, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
中有这个时没有被执行吗?
这是我的数据库实例组合框的XAML。我在这里遇到的一个问题是“value”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));
}
}
}
答案 0 :(得分:0)
您应该将SelectedItem
的{{1}}属性绑定到ComboBox
属性并删除SelectedDBInstance
:
SelectedValuePath
<ComboBox x:Name="cbxRLFDBInstances" ItemsSource="{Binding DBInstances}"
SelectedItem="{Binding SelectedDBInstance, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="DBInstanceName"/>
属性仅在您要绑定到与SelectedValuePath
集合中的项目类型不同的源属性时使用。
要最初选择项目,您应将ItemsSource
属性设置为SelectedDBInstance
集合中的项目:
DBInstances