首页 > 解决方案 > 如何从不同于 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#.netwpfmvvm

解决方案


推荐阅读