在xaml中,我有一个列表框,其中包含1行和2列的网格。在第一列中我有一个名称,在第二列中我有另一个列表框...我有第一个列表框绑定到一个可观察的Enclosure项目集合。在Enclosure类中,我有另一个可观察的服务器集合(另一个类)。我也试图将它绑定到列表框。当我向可观察集合添加项目时,EnclosureID正在正常工作和更新。但是,我不太确定如何让Slist绑定到我在其他列表框中的列表框。有人有主意吗?我可以使用另一种方法吗?
public class Enclosure
{
private string enclosureID; //bound to the first listbox
//I want to bind this below to the second listbox
//There is another class called Server with various properties
public ObservableCollection<Server> Slist = new ObservableCollection<Server>();
public string EnclosureID
{
get { return enclosureID; }
set { enclosureID = value; }
}
}
在xaml:
<ListBox x:Name="lb1" ItemsSource="{Binding}" DataContext="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="txtEnclosure" Text="{Binding Path=EnclosureID}" Background="Aqua" Grid.Column="0" Grid.Row="0" />
<ListBox x:Name="lbserver" ItemsSource="{Binding Slist}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Grid.Column="1" Grid.Row="0">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock x:Name="txtServer" Text="{Binding Path=HostnameID}" Background="Beige"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
要填充列表,我使用此方法:
//Query the database for enclosures and populate the Enclosure observable collection in the Settings class
public void GetEnclosures()
{
bool exception = false;
Enclosure enclosure = new Enclosure();
Server server = new Server();
server.HostnameID = "HEY";
OleDbCommand GetEnclosuresCommand = new OleDbCommand(Settings.GetEnclosuresQuery, Settings.conn);
Settings.conn.Open();
try
{
Settings.myReader = GetEnclosuresCommand.ExecuteReader();//begin reading
}
catch
{
MessageBox.Show("The Enclosure table is currently being used by another application. Please close the table and run this application again.");
Settings.conn.Close();
exception = true;
}
if (!exception)
{
// while there are enteries to retrieve
while (Settings.myReader.Read())
{
enclosure.EnclosureID = Settings.myReader.GetString(0);
enclosure.Slist.Add(server);
Settings.Elist.Add(enclosure);
enclosure = new Enclosure();
server = new Server();
server.HostnameID = "HI";
}
// Close when done reading.
Settings.myReader.Close();
// Close the connection.
Settings.conn.Close();
}
else
{
this.NavigationService.Navigate(new Uri("MainPage.xaml", UriKind.Relative));
}
}
答案 0 :(得分:0)
可能是错的,但不像......那样简单。
<ListBox
x:Name="lbserver"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Grid.Column="1"
Grid.Row="0"
ItemsSource="{Binding Slist}">
同时更改此
public ObservableCollection<Server> Slist = new ObservableCollection<Server>();
说
public ObservableCollection<Server> Slist { get; set; }
//...
Slist = new ObservableCollection<Server>();