簡體   English   中英

當ObservableCollection中的集合更改時,將新條目添加到ReactiveList

[英]When collection changed in ObservableCollection add new entries to ReactiveList

我有一個ObservableCollectionTcpClient填充。 當新數據到達(添加了新Items)時,我想在ItemsControl創建新的Button。 它以舊的方式工作(與CollectionChanged ),但我無法在ReactiveUI中使用它。

我是ReactiveUI的新手,這對我來說很難入門。 您能否通過讓我走上正確的道路或者提供一些示例代碼來幫助我?

想法:

public class ChooseMachineViewModel : ReactiveObject
{
    public ReactiveList<Button> ButtonList { get; set; }
    private Dictionary<ushort, Button> addressToButton;

    //This one is normaly in another class and will be filled by a TcpClient
    public readonly ObservableCollection<WWSS.Message.CUStatus> ControlUnitsStatus;

    public ChooseMachineViewModel()
    {



        //TODO: Make this Reactive!
        //The ButtonList for an ItemsControl
        ButtonList = new ReactiveList<Button>();
        //The Dictonary for addresses -> Button
        addressToButton = new Dictionary<ushort, Button>();
        //The ObservableCollection filled by a TCP Server
        ControlUnitsStatus.CollectionChanged += ControlUnitsStatus_CollectionChanged;

    }


    private void ControlUnitsStatus_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {

        if (e.NewItems != null)
        {
            foreach (WWSS.Message.CUStatus stat in e.NewItems)
            {
                TryAddButton(stat);//When new Status arrive, try to create new button
            }
        }
        if (e.OldItems != null)
        {
            foreach (WWSS.Message.CUStatus stat in e.OldItems)
            {
                TryRemoveButton(stat);//When Status removed, try to remove the button
            }
        }
    }

    private bool TryAddButton(WWSS.Message.CUStatus status)
    {
        if (!addressToButton.ContainsKey(status.Address))//if the Address is already in the dictonary don't create a button
        {
            var but = new Button { Content = status.Address.ToString() };
            addressToButton.Add(status.Address, but);
            ButtonList.Add(but);
            return true;
        }
        return false;
    }
    private void TryRemoveButton(WWSS.Message.CUStatus status)
    {
        if (addressToButton.ContainsKey(status.Address))
        {
            ButtonList.Remove(addressToButton[status.Address]);
            addressToButton.Remove(status.Address);

        }
    }
}

訣竅是使用CreateDerivedCollection

public class ChooseMachineViewModel : ReactiveObject
{
    public IReactiveDerivedList<Button> ButtonList { get; set; }

    public ChooseMachineViewModel(ObservableCollection<CUStatus> source)
    {
        addressToButton = new Dictionary<ushort, Button>();
        ButtonList = ControlUnitsStatus.CreateDerivedCollection(status => new Button { Content = status.Address.ToString() },
                                                    status => !ButtonList.Any(button => button.Content.ToString().Equals(status.Address.ToString())));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM