1

毎回「更新」する必要のある特定のデータグリッドがあります...1分としましょう。

タイマーは最良の選択肢ですか?

    public PageMain()
    {
        InitializeComponent();
        DataGridFill();
        InitTimer();
    }

    private void InitTimer()
    {
        disTimer = new Timer(new TimeSpan(0, 1, 0).TotalMilliseconds);
        disTimer.Elapsed += disTimer_Elapsed;
        disTimer.Start();
    }

    void disTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        DataGridFill();
    }

    private void DataGridFill()
    {
        var items = GetItems(1);
        ICollectionView itemsView =
            CollectionViewSource.GetDefaultView(items);

        itemsView.GroupDescriptions.Add(new PropertyGroupDescription("MyCustomGroup"));
        // Set the view as the DataContext for the DataGrid
        AmbientesDataGrid.DataContext = itemsView;
    }

より「汚い」解決策はありますか?

4

2 に答える 2

2

aを「更新」する最良の方法DataGridは、アイテムのコレクションにバインドし、X分ごとにアイテムのソースコレクションを更新することです。

<DataGrid ItemsSource="{Binding MyCollection}" ... />

このように、DataGridそれ自体を参照する必要がないため、UIロジックとアプリケーションロジックは分離されたままになり、更新に時間がかかる場合は、UIをロックせずにバックグラウンドスレッドで実行できます。

WPFは、あるスレッドで作成されたオブジェクトを別のスレッドから更新できないため、データを取得してバックグラウンドスレッドの一時コレクションに格納してから、メインUIスレッドでバインドされたコレクションを更新することをお勧めします。

タイミングビットには、必要に応じて、Timerまたは場合によってはを使用しDispatcherTimerます。

var timer = new System.Windows.Threading.DispatcherTimer();
timer.Tick += Timer_Tick;
timer.Interval = new TimeSpan(0,1,0);
timer.Start();


private void Timer_Tick(object sender, EventArgs e)
{
    MyCollection = GetUpdatedCollectionData();
}
于 2012-10-16T20:17:41.343 に答える
1

私の好みのアプローチ:

public sealed class ViewModel
{
    /// <summary>
    /// As this is readonly, the list property cannot change, just it's content so
    /// I don't need to send notify messages.
    /// </summary>
    private readonly ObservableCollection<T> _list = new ObservableCollection<T>();

    /// <summary>
    /// Bind to me.
    /// I publish as IEnumerable<T>, no need to show your inner workings.
    /// </summary>
    public IEnumerable<T> List { get { return _list; } }

    /// <summary>
    /// Add items. Call from a despatch timer if you wish.
    /// </summary>
    /// <param name="newItems"></param>
    public void AddItems(IEnumerable<T> newItems)
    {            
        foreach(var item in newItems)
        {
            _list.Add(item);
        }
    }

    /// <summary>
    /// Sets the list of items. Call from a despatch timer if you wish.
    /// </summary>
    /// <param name="newItems"></param>
    public void SetItems(IEnumerable<T> newItems)
    {
        _list.Clear();
        AddItems(newItems);
    }
}

AddRangeまともな/ReplaceRangeの欠如が好きではありませんObservableCollection<T>か?ObservableCollection<T>私もそうではありませんが、メッセージを効率的に追加するための子孫であり、AddRange単体テストもあります。

ObservableCollectionはAddRangeメソッドをサポートしていないため、INotifyCollectionChangingはどうですか?以外に、追加されたアイテムごとに通知を受け取ります。

于 2012-10-17T19:42:40.157 に答える