Проблема с привязкой ListBox к Obs.Collection C # WPF MVVM - PullRequest
0 голосов
/ 13 октября 2019

Существует ListBox ThreadBox.

ThreadBox:

<ListBox x:Name="ThreadBox" SelectionChanged="ThreadBox_SelectionChanged" Grid.Column="1" ItemsSource="{Binding MThreadPV}" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="2">
                                <CheckBox IsChecked="{Binding Path=Check}"></CheckBox>
                                <TextBlock FontSize="16" HorizontalAlignment="Center">
                                    <Hyperlink TextDecorations="" NavigateUri="{Binding Path=Url}" Foreground="White" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock FontSize="16" Text="{Binding Path=Thread}" HorizontalAlignment="Center"/></Hyperlink>
                                </TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
</ListBox>

DataTemplate привязано к классу CheckedItem

CheckedItem:

public class CheckedItem
{
    private string thread;
    private string url;
    private bool check;
    private int id;

    public int ID
    {
        get { return id; }
        set { id = value; }
    }

    public bool Check
    {
        get { return check; }
        set { check = value; }
    }

    public string Thread
    {
        get { return thread; }
        set
        {
            thread = value;
        }
    }

    public string Url
    {
        get { return url; }
        set
        {
            url = value;
        }
    }
}

Попытка привязать ObservableCollection<CheckedItem> к ThreadBox с помощью MVVM.

Я использовал руководство из RUS , но что-то пошло не так.

Модель :

class ThreadBoxModel : BindableBase
{
    private readonly ObservableCollection<source.CheckedItem> _myValues = new ObservableCollection<source.CheckedItem>();
    public readonly ReadOnlyObservableCollection<source.CheckedItem> MThreadValues;
    public ThreadBoxModel()
    {
        MThreadValues = new ReadOnlyObservableCollection<source.CheckedItem>(_myValues);
    }
    public void AddValue(source.CheckedItem item)
    {
        _myValues.Add(item);
        RaisePropertyChanged("T_Sum");
    }
    public void RemoveValue(int index)
    {
        if (index >= 0 && index < _myValues.Count) _myValues.RemoveAt(index);
        RaisePropertyChanged("T_Sum");
    }
    public int T_Sum => MThreadValues.Count;
}

VM :

public class MyThreadsVM : BindableBase
{
    readonly source.models.ThreadBoxModel _model = new source.models.ThreadBoxModel();
    public MyThreadsVM()
    {
        _model.PropertyChanged += (s, e) => { RaisePropertyChanged(e.PropertyName); };
        AddCommand = new DelegateCommand<source.CheckedItem>(str => {
            _model.AddValue(str);
        });
        RemoveCommand = new DelegateCommand<int?>(i => {
            if (i.HasValue) _model.RemoveValue(i.Value);
        });
    }

    public DelegateCommand<source.CheckedItem> AddCommand { get; }
    public DelegateCommand<int?> RemoveCommand { get; }
    public int T_Sum => _model.T_Sum;
    public ReadOnlyObservableCollection<source.CheckedItem> MThreadPV => _model.MThreadValues;
}

Я использую ModernWindow и из-за этого:

<mui:ModernWindow.DataContext>
    <local:MyThreadsVM/>
</mui:ModernWindow.DataContext>

Добавление элементов :

private void ThreadBox_Update()
    {
        if (source.StaticData.cookies != null)
        {
            List<List<Dictionary<string, string>>> data = this.dark.GetMyThreads();
            int iterator = 0;
            source.models.ThreadBoxModel model = new source.models.ThreadBoxModel();
            foreach (var list in data)
            {

                string url = list[0]["url"];
                model.AddValue(new source.CheckedItem { Thread = list[0]["thread"], Url = $"{source.StaticData.head_url}{url}", ID = iterator, Check = false });
                iterator++;
            }
        }
    }

ThreadBox не обновляется.

В чем может быть проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...