【问题标题】:Binding list to listbox and show more info of currently selected item将列表绑定到列表框并显示当前所选项目的更多信息
【发布时间】:2018-03-30 21:03:06
【问题描述】:

我有一个班级敌人

public class Enemy : Entity
{
    private int _BaseAddress;
    private int _BaseOffset;
    private int _HealthOffset;
    private int _AmmoOffset;
    private int _X_Coord_Offset;
    private int _Y_Coord_Offset;
    private int _Z_Coord_Offset;

    public Enemy(int BaseAddress, int BaseOffset, int HealthOffset, int AmmmoOffset, int X_Coord_Offset, int Y_Coord_Offset, int Z_Coord_Offset)
    {
        _BaseAddress = BaseAddress;
        _BaseOffset = BaseOffset;
        _HealthOffset = HealthOffset;
        _AmmoOffset = AmmmoOffset;
        _X_Coord_Offset = X_Coord_Offset;
        _Y_Coord_Offset = Y_Coord_Offset;
        _Z_Coord_Offset = Z_Coord_Offset;
    }

    public int BaseAddress
    {
        get
        {
            int temp = BitConverter.ToInt32(ReadMemory(_BaseAddress, sizeof(int)), 0);
            return BitConverter.ToInt32(ReadMemory(temp + _BaseOffset, sizeof(int)), 0);
        }
    }

    public int Health
    {
        get
        {
            return BitConverter.ToInt32(ReadMemory(BaseAddress + _HealthOffset, sizeof(int)), 0);
        }

    }

    public int Ammo
    {
        get
        {
            return BitConverter.ToInt32(ReadMemory(BaseAddress + _AmmoOffset, sizeof(int)), 0);
        }
    }

    public float X_Coordinate
    {
        get
        {
            return BitConverter.ToSingle(ReadMemory(BaseAddress + _X_Coord_Offset, sizeof(float)), 0);
        }
    }

    public float Y_Coordinate
    {
        get
        {
            return BitConverter.ToSingle(ReadMemory(BaseAddress + _Y_Coord_Offset, sizeof(float)), 0);
        }
    }

    public float Z_Coordinate
    {
        get
        {
            return BitConverter.ToSingle(ReadMemory(BaseAddress + _Z_Coord_Offset, sizeof(float)), 0);
        }
    }

    //I know this has no value
    public string name;
}

我有一个敌人列表

List<Enemy> list = new List<Enemy>();

我有一个列表框

<ListBox Grid.Column="1" Grid.Row="1" Name="lstBEnemies" Margin="20"/>

我有一些标签。我希望为列表中的每个敌人对象创建一个 listboxitem 并且内容是字符串名称。此外,当我选择一个列表框项时,我希望它通过标签向我显示所选敌人对象的所有信息。

我已经设法将列表中的每个项目添加到列表框中

for (int i = 0; i < EnemyList.Count; i++)
{
    lstBEnemies.Items.Add(EnemyList[i]);
}

我还创建了一个计时器,每 5 毫秒更新一次标签上的信息。 我的问题是,我该怎么做才能通过标签显示当前选定项目的敌人对象的信息?

编辑: 这就是我更新标签的方式

private void DpTimerTick_GetEnemyAmmo(object sender, EventArgs e)
    {
        lbEnemyAmmoInfo.Content = EnemyList[0].Ammo;
    }

【问题讨论】:

标签: c# wpf binding listbox label


【解决方案1】:

您可以将TextBlockText 属性绑定到ListBoxSelectedItem

<TextBlock Text="{Binding SelectedItem.BaseAddress, ElementName=lstBEnemies}" />

标签对应的绑定是:

<Label Content="{Binding SelectedItem.BaseAddress, ElementName=lstBEnemies}" />

编辑:

那么你为什么不简单地选择合适的项目呢?:

private void DpTimerTick_GetEnemyAmmo(object sender, EventArgs e)
{
    lstBEnemies.SelectedItem = EnemyList[0];
}

<Label Content="{Binding SelectedItem.Ammo, ElementName=lstBEnemies}" />

【讨论】:

  • 问题是当我使用这种方法时,标签只获取一次值,它不会更新。
  • 当您更改列表框中的选择时,它们将被更新。您希望它们何时更新?
  • 它们应该每 10 毫秒更新一次。我以前用计时器做过,但在这种情况下我该怎么做
  • 这取决于您如何更新它们。请显示代码的所有相关部分。
  • 设置 ListBox 的 SelectedItem 属性。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多