c# - 如何从不同于 ViewModel 的类更新我的集合
问题描述
所以我正在尝试使用 WPF 构建一个简单的 2D 游戏,现在的想法是,当我单击“连接”按钮时,我想将玩家添加到 aObservableCollection<Player>
以便该ListView
集合ItemSource
的更新。基本上,当我在所述列表中单击连接时,我可以看到玩家姓名。
我很难弄清楚我应该如何将播放器添加到集合中。这就是我现在所拥有的
<Window.DataContext>
<viewmodel:BaseViewModel />
</Window.DataContext>
<Grid>
<Grid x:Name="PlayerArea">
<Border Width="25" HorizontalAlignment="Left" Background="Green"/>
<Border Width="25" HorizontalAlignment="Right" Background="Green"/>
<Border Height="25" VerticalAlignment="Top" Background="Green">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="Connect" Width="100" Command="{Binding ConnectCommand}"/>
<Button Content="Disconnect" Width="100" Command="{Binding DisconnectCommand}"/>
</StackPanel>
</Border>
<Border Height="25" VerticalAlignment="Bottom" Background="Green"/>
<Canvas Background="Transparent"
Width="735" Height="365">
<Grid Background="Black"
Opacity=".5"
Width="125"
Height="200"
Canvas.Left="600" Canvas.Top="10">
<ListView ItemsSource="{Binding Client.Players}" DisplayMemberPath="Username">
</ListView>
</Grid>
<Rectangle Width="50"
Height="50"
Fill="Red"
x:Name="localPlayer"
Canvas.Top="{Binding LocalPlayer.Position.Y, UpdateSourceTrigger=PropertyChanged}"/>
</Canvas>
</Grid>
</Grid>
您可以看到绑定了ItemSource的 ListView,您还可以看到我已经ViewModel
为 Window设置了BaseViewModel
class BaseViewModel : ObservableObject
{
public static ObservableCollection<Player> Players { get; set; }
public RelayCommand ConnectCommand { get; set; }
public BaseViewModel()
{
Players = new ObservableCollection<Player>();
ConnectCommand = new RelayCommand(o => { Connect(); }, o => true);
}
public void Connect()
{
//Connect to the server
Client c = new Client();
c.Connect();
}
...
在 Client.cs 我有这个
public ObservableCollection<Player> players = new ObservableCollection<Player>();
public void Connect()
{
//client.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555), new AsyncCallback(ConnectCallback), client);
players.Add(new Player { Username = "Player" });
}
ObservableObject
看起来像这样
[Serializable]
public class ObservableObject : INotifyPropertyChanged
{
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
单击时我正在考虑这样做,Connect
但我不确定如何从Client class
解决方案
推荐阅读
- c# - 我想用winapi在“LBUTTONDOWN”之后做“MOUSEMOVE”。但是“MouseButtons”信息没有出现
- postgresql - 在 PostgreSQL 中创建函数时获取“未定义符号:Float8GetDatum”
- python - scikit-learn:为什么这个 2 折交叉验证图看起来像 4 折交叉验证?
- java - maven-shade-plugin 不会替换原来的 jar
- ansible - 如何在jinja2模板中使用变量
- c# - TaskScheduler vs Timer 在 C# 中调度任务:何时使用?
- azure - 有没有办法跟踪谁在访问 azure vms?
- javascript - 使用 javascript 更新自定义元素阴影 DOM 中的插槽文本
- flutter - 如何使用事件通道
- python - Python:转置 100 个单词的 10 个字符的列表