使用LINQ获得1-2-3分数并将它们绑定到View

时间:2011-08-23 05:31:02

标签: c# silverlight linq data-binding mvvm

我有一张桌子上有球员和得分(名字:迈克得分:10,姓名:彼得得分:5等)和一张有3张青铜,银牌和金牌的照片。 在每张图片的下方,我想每周/每周显示获奖者的玩家名称。 很可能是有多个铜牌,银牌或金牌。

在我的TotalViewModel中,我有一个ObservableCollection用于所有总分数:

public const string TotalsPropertyName = "Totals";

private ObservableCollection<TotalViewModel> _totals;

public ObservableCollection<TotalViewModel> Totals
{
    get
    {
        return _totals;
    }
    set
    {
        if (_totals == value)
            return;
        _totals = value;
        RaisePropertyChanged(TotalsPropertyName);
    }
}

我想使用IEnumerable,因为多个数字一,二,三得分:

public IEnumerable<TotalViewModel> FirstOne { get; private set; }

private void UpdateFirstOne()
{
    this.FirstOne = this.Totals.Where(elem => elem.Model.score > 0).OrderByDescending(e => e.Model.score);
}

private void Totals_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    try
    {
        this.UpdateFirstOne();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}

我的View的DataContext对于简单的绑定工作正常,它在UserControl中设置:

DataContext="{Binding MainTotal, Source={StaticResource Locator}}

但是结果没有显示在我的DataGrid中(猜测我在这里犯了一个愚蠢的错误):

<data:DataGrid ItemsSource="{Binding FirstOne, Mode=OneWay}" AutoGenerateColumns="true" Height="100" Name="dataGrid1" Width="120" />

所以我有两个问题:

  1. 如何获得所需的1/2/3分数?
  2. 如何在我的视图中获取它们?
  3. 感谢。

2 个答案:

答案 0 :(得分:2)

好吧,我不会进入数据绑定位,但提取前三位的linq查询可能是这样的:

var topThreeScoringNameLists =
    Totals
        .GroupBy(x => x.Model.Score)
        .OrderByDescending(x => x.Key)
        .Take(3)
        .Select(x => 
            String.Join(", ", x.Select(y => y.Model.Name).ToArray()));

答案 1 :(得分:1)

您绑定到FirstOne,因此您需要为该属性执行propertychanged。

public IEnumerable<TotalViewModel> FirstOne 
{ 
    get
    {
        return _firstOne;
    }
    private set
    {
        _firstOne = value;
        RaisePropertyChanged("FirstOne");
    }
}