Я уже несколько часов бьюсь головой о привязке элемента WPF ListBox и надеюсь получить совет.Мое приложение имеет три основных элемента:
- Класс
Player
, который отправляет и получает данные через TcpClient
. - A
MainWindow
, который обрабатывает графический интерфейс и предоставляет методы, которыеPlayer
может вызвать данные для обновления пользовательского интерфейса на основе сетевых сообщений. - A
UserControl
с именем HostLobby
, который содержит 1) ListBox
с именем gamesListBox
для отображения новых игр в том виде, как они есть.добавлены клиентами через Player
и 2) элементы пользовательского интерфейса для добавления новой игры, которая будет транслироваться всем клиентам.
Я подтвердил, что часть «вверх по течению» работает.Вы можете ввести новую информацию об игре в HostLobby
, отправить, и она будет распространяться среди клиентов, как и ожидалось.Кроме того, клиенты правильно реагируют на сообщения сервера о том, что была добавлена новая игра.
Проблема в том, что я не могу gameListBox
обновить.Я установил тестовые кнопки на элементах управления HostLobby
и MainWindow
, чтобы убедиться, что привязка работает правильно - что это такое.Я просто не могу обновить, передавая данные из Player
.Есть идеи, что я делаю не так?
Соответствующий код:
Player.cs
public void AddGameToLobby(string name, int mp)
{
// name and mp are provided by the network message handler and work fine
WriteToLog("Attempting to add game to host lobby", true);
mainWindow.AddGameToLobby(name, mp);
}
MainWindow.cs
public void AddGameToLobby(string n, int mp)
{
hostLobby.AddGameToList(n, mp);
}
HostLobby.cs
private MainWindow parent; // used to call an AddGame event when client adds a game
public ObservableCollection<Game> games;
public class Game
{
public string Name { get; set; }
}
public HostLobby(MainWindow mw)
{
InitializeComponent();
parent = mw;
games = new ObservableCollection<Game>();
// add some test items - this works. the ListBox updates properly
games.Add(new Game() { Name = "game1" });
games.Add(new Game() { Name = "game2" });
games.Add(new Game() { Name = "game3" });
gamesListBox.ItemsSource = games;
}
public void AddGameToList(string n, int maxp)
{
// called to announce a new game added by another client
// call stack is Player.AddGameToLobby -> MainWindow.AddGameToLobby -> this.AddGameToList
string msg = String.Format("{0} (0/{1})", n, maxp.ToString());
games.Add(new Game() { Name = msg });
}
HostLobby.xaml
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="50" Orientation="Vertical" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<Label HorizontalContentAlignment="Right" Width="80">Game Name:</Label>
<TextBox Name="gameNameTextBox" VerticalContentAlignment="Center" Width="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label HorizontalContentAlignment="Right" Width="80">Max Players:</Label>
<TextBox Name="maxPlayersTextBox" VerticalContentAlignment="Center" Width="200"/>
</StackPanel>
<Button Name="addGameButton" Click="addGameButton_Click" Margin="0,20,0,0" Width="200" Height="30">Add Game</Button>
</StackPanel>
<StackPanel Orientation="Vertical" VerticalAlignment="Center" Margin="50" Grid.Column="1">
<Label>Current Games</Label>
<ListBox Name="gamesListBox" MinHeight="200">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>