0

正如标题所述,我正在尝试查找 an 的多个实例中的项目总数ObservableCollection并将结果绑定到 a Textblock。我设法通过LINQ获得了正确的号码......

public WorldViewModel(GameContainer container)
{
    GlobalPopulation = container.Regions
            .SelectMany(x => x.Settlements)
            .SelectMany(x => x.Population)
            .Distinct()
            .Count();
}

public int GlobalPopulation { get; set; }

...但 LINQ 不适用于 XAML 绑定。初始值正确显示,但不会随着计数的变化而更新。如果我创建了我的视图模型的新实例,则会显示新数字,因为再次调用构造函数。我的视图模型继承自 MVVM 的 ViewModelBase 并通过 Kind of Magic 实现 INPC。我有其他属性正确绑定并按预期运行,所以这不是问题。

我尝试过使用 OLinq 和 BindableLinq 等工具,但没有成功。现在看起来我必须在没有 LINQ 的情况下执行此操作,但不幸的是,我不知道如何在没有 LINQ 的情况下检索相同的值并将其绑定到Textblock. 如果有人可以向我展示一种在这种情况下使 LINQ 绑定工作的方法,或者如何在没有 LINQ 的情况下实现相同的结果,我将不胜感激。

4

2 回答 2

1

很容易忘记您可以订阅自己的更改ObservableCollection

// not production-quality code
public WorldViewModel(GameContainer container)
{
    foreach (var region in container.Regions)
    {
        region.CollectionChanged += (s,e) => RecalculateCount(container);
        foreach(var settlement in region.Settlements)
        {
            settlement.CollectionChanged += (s,e) => RecalculateCount(container);
            foreach( var population in settlement.Population)
            {
                population.CollectionChanged += (s,e) => RecalculateCount(container);
            }        
        }
    }

    RecalculateCount();
}

private static void RecalculateCount(GameContainer container)
{
    GlobalPopulation = container.Regions
                .SelectMany(x => x.Settlements)
                .SelectMany(x => x.Population)
                .Distinct()
                .Count();
}

只要GlobalPopulation触发属性更改事件,对结算计数的更改就会传播到 UI。

(您可能希望将GameContainer实例存储在您的视图模型上,然后从 RecalculateCount 的非静态版本中引用它,而不是在事件处理 lambda 中捕获它;该代码旨在作为一个插入式演示,但可能隐藏了奇怪的对象生命周期问题。)

于 2013-09-06T00:19:52.080 回答
0

改变这个:

public int GlobalPopulation { get; set; }

对此:

private int _globalPopulation;
public int GlobalPopulation 
{ 
    get { return _globalPopulation; }
    set
    {
        _globalPopulation = value;
        NotifyPropertyChange("GlobalPopulation");
    }
}
于 2013-09-05T20:37:31.083 回答