RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 663112
Accepted
EvgeniyZ
EvgeniyZ
Asked:2020-05-08 00:42:40 +0000 UTC2020-05-08 00:42:40 +0000 UTC 2020-05-08 00:42:40 +0000 UTC

帮助实现WPF中的数据刷新

  • 772

先生们,请帮助实施数据的主管更新。

应用操作:

  • 该事件会定期下载一个 JSON 文件。
  • 我们使用事件的签名方法来读取Load();这个文件并将所有数据输入到某个模型中。
  • 我们进行数据绑定和输出。

目前我有这样一个“拐杖”(删除旧的数据绑定并用新的绑定它):

 if (alertbox.ItemsSource != null) alertbox.ItemsSource = null;
 alertbox.ItemsSource = News.Data.Posts;

你真的需要摆脱它。我尝试实施INotifyPropertyChanged,但无论我做什么,数据仍然很旧......


实际上代码本身:

从 JSON 文件加载数据(主要方法Read和静态方法方便Load):

internal class Game
{
    private static GameView Read(string fileName)
    {
        GameView data;
        using (var file = File.OpenText(fileName))
        {
            var serializer = new JsonSerializer();
            data = (GameView) serializer.Deserialize(file, typeof(GameView));
        }

        return data;
    }

    /// <summary>
    ///     Основные игровые данные.
    /// </summary>
    public static GameView Data;

    /// <summary>
    ///     Загружаем JSON файл с игровыми данными.
    /// </summary>
    /// <param name="filename">Путь до JSON файла</param>
    public static void Load(string filename = "temp")
    {
        if (filename == "temp") filename = $"{Settings.Program.Directories.Temp}/GameData.json";
        Data = Read(filename);
    }
}

型号GameView:

public class GameView
{
    public int Version { get; set; }
    public string MobileVersion { get; set; }
    public string BuildLabel { get; set; }
    public int Time { get; set; }
    public int Date { get; set; }
    public List<Alert> Alerts { get; set; }
    public List<double> ProjectPct { get; set; }
    public string WorldSeed { get; set; }
}

public class Alert
{
    [JsonProperty("_id")]
    public Id Id { get; set; }
    public Activation Activation { get; set; }
    public Expiry Expiry { get; set; }
    public MissionInfo MissionInfo { get; set; }
}

public class MissionInfo
{
    public string MissionType { get; set; }
    public string Faction { get; set; }
    public string Location { get; set; }
    public string LevelOverride { get; set; }
    public string EnemySpec { get; set; }
    public int MinEnemyLevel { get; set; }
    public int MaxEnemyLevel { get; set; }
    public double Difficulty { get; set; }
    public int Seed { get; set; }
    public int MaxWaveNum { get; set; }
    public MissionReward MissionReward { get; set; }
    public string ExtraEnemySpec { get; set; }
    public List<string> CustomAdvancedSpawners { get; set; }
    public bool? ArchwingRequired { get; set; }
    public bool? IsSharkwingMission { get; set; }
}

我怎么打电话:

Game.Load();
alertbox.ItemsSource = Game.Data.Alerts;

嗯,目前最简单的ListBox:

<ListBox x:Name="alertbox" Background="{x:Null}" BorderBrush="{x:Null}">
                    <ListBox.ItemTemplate>
                        <DataTemplate >
                            <Label Content="{Binding MissionInfo.Location}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

在这种情况下帮助实现对在加载 JSON 文件后立即更新界面中的数据的支持。整个项目上传到GitHub

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2020-05-08T01:29:57Z2020-05-08T01:29:57Z

    对于初学者,您将无法绑定到字段。绑定必须是属性。

    Game然后,绑定到静态属性是不方便的,游戏本身就是一个实体,所以让类的方法和属性成为非静态的对你来说是有意义的。此外,您必须实施INotifyPropertyChanged,不要在您的代码中看到它。

    VM 我们从这里获取基类,我们写:

    internal class Game : VM
    {
        private static GameView Read(string fileName)
        {
            GameView data;
            using (var file = File.OpenText(fileName))
            {
                var serializer = new JsonSerializer();
                data = (GameView) serializer.Deserialize(file, typeof(GameView));
            }
    
            return data;
        }
    
        GameView data;
        public GameView Data { get => data; set => Set(ref data, value); }
    
        public void Load(string filename = "temp")
        {
            if (filename == "temp")
                filename = $"{Settings.Program.Directories.Temp}/GameData.json";
            Data = Read(filename);
        }
    }
    

    此外,您的内部类是不可变的吗?如果没有,他们需要实施INotifyPropertyChanged. 并且列表需要实现INotifyCollectionChanged,也就是说,理论上你只需要ObservableCollection<T>:

    public class GameView : VM
    {
        int version;
        public int Version
        {
            get => version;
            set => Set(ref version, value);
        }
    
        // ...
    
        ObservableCollection<Alert> alerts;
        public ObservableCollection<Alert> Alerts
        {
            get => alerts;
            set => Set(ref alerts, value);
        }
    
        // ...
    }
    

    对于您计划绑定的其他类也是如此。

    这样,您就可以在 XAML 中组织绑定。

    <ListBox Background="{x:Null}" BorderBrush="{x:Null}" ItemsSource="{Binding Data.Alerts}">
        <ListBox.ItemTemplate>
            <DataTemplate >
                <Label Content="{Binding MissionInfo.Location}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5