据我所知,您需要一些机制,在第一个组合中选择时会使用第一个组合相关数据更新第二个组合(基于您的问题名称:
我有两个组合框和 xml 文件,我想从 xml 填充组合框 1 中的服务器名称,并根据服务器名称填充第二个组合框
)。
这是一个基于两个可观察集合及其更新机制的解决方案。
1.Xaml代码:
<Window x:Class="SimpleDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:simpleDataGrid="clr-namespace:SimpleDataGrid"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<simpleDataGrid:GridViewModel/>
</Window.DataContext>
<Grid >
<DataGrid x:Name="SelectDataGrid" ItemsSource="{Binding Persons}" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn x:Name="dgCheckBox" Header="Select" Width="45" Binding="{Binding IsChecked}"/>
<DataGridTextColumn Header="FIRST NAME" Width="125" Binding="{Binding FNAME}"/>
<DataGridTextColumn Header="LAST NAME" Width="125" Binding="{Binding LNAME}"/>
<DataGridComboBoxColumn Header="Servers"
DisplayMemberPath="ServerName" SelectedValueBinding="{Binding SelectedServer, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.Servers}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.Servers}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridComboBoxColumn Header="Dbs"
DisplayMemberPath="DbName"
SelectedValueBinding="{Binding SelectedDb, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.Dbs}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.Dbs}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid></Window>
2。提供解决方案的主模型代码。 UpdateDbCollection 方法可以调用您的 GetDatabases 方法,查询与服务器相关的数据库,将该数据放入“newDbs”列表并使用新数据更新第二个组合可观察集合当它添加一个新 数据和改造一个旧 数据时的方式。
public class Person : BaseObservableObject
{
private string _lName;
private string _fName;
private bool _checked;
private object _selectedServer;
private DbDetails _selectedDb;
public Person()
{
Dbs = new ObservableCollection<DbDetails>();
Servers = new ObservableCollection<ServerDetails>(new List<ServerDetails>
{
new ServerDetails
{
ServerName = "A",
DbDetailses = new List<DbDetails>
{
new DbDetails{DbName = "AA"},
new DbDetails{DbName = "AB"},
new DbDetails{DbName = "AC"},
}
},
new ServerDetails
{
ServerName = "B",
DbDetailses = new List<DbDetails>
{
new DbDetails{DbName = "BA"},
new DbDetails{DbName = "BB"},
new DbDetails{DbName = "BC"},
}
},
new ServerDetails
{
ServerName = "C",
DbDetailses = new List<DbDetails>
{
new DbDetails{DbName = "CA"},
new DbDetails{DbName = "CB"},
}
}
});
}
public DbDetails SelectedDb
{
get { return _selectedDb; }
set
{
_selectedDb = value;
OnPropertyChanged();
}
}
public object SelectedServer
{
get { return _selectedServer; }
set
{
_selectedServer = value;
OnPropertyChanged();
UpdateDbCollection(SelectedServer as ServerDetails);
}
}
private void UpdateDbCollection(ServerDetails serverDetails)
{
//here you can get your db details by selected server
var newDbs = serverDetails.DbDetailses;
newDbs.ForEach(details => Dbs.Add(details));
var valuesToClear =
Dbs.Where(
existingDbDetails => newDbs.FirstOrDefault(dbDetails => existingDbDetails == dbDetails) == null).ToList();
valuesToClear.ForEach(details => Dbs.Remove(details));
}
public ObservableCollection<ServerDetails> Servers { get; set; }
public ObservableCollection<DbDetails> Dbs { get; set; }
public bool IsChecked
{
get { return _checked; }
set
{
_checked = value;
OnPropertyChanged();
}
}
public string LNAME
{
get { return _lName; }
set
{
_lName = value;
OnPropertyChanged();
}
}
public string FNAME
{
get { return _fName; }
set
{
_fName = value;
OnPropertyChanged();
}
}
}
3。型号:
public class ServerDetails:BaseObservableObject
{
private string _serverName;
public string ServerName
{
get { return _serverName; }
set
{
_serverName = value;
OnPropertyChanged();
}
}
public List<DbDetails> DbDetailses { get; set; }
}
public class DbDetails:BaseObservableObject
{
private string _dbName;
public string DbName
{
get { return _dbName; }
set
{
_dbName = value;
OnPropertyChanged();
}
}
}
-
查看型号代码:
公共类 GridViewModel:BaseObservableObject
{
public GridViewModel()
{
var l = new List<Person>
{
new Person {FNAME = "John", LNAME = "W"},
new Person {FNAME = "George", LNAME = "R"},
new Person {FNAME = "Jimmy", LNAME = "B"},
new Person {FNAME = "Marry", LNAME = "B"},
new Person {FNAME = "Ayalot", LNAME = "A"},
};
Persons = new ObservableCollection<Person>(l);
}
public ObservableCollection<Person> Persons { get; set; }
}
BaseObservableObject 是 INotifyPropertyChanged 的简单实现。
希望对你有所帮助。
谢谢问候,