Не удается добавить элемент в коллекцию Observable (или пользовательский интерфейс не обновляется) - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблема с нубом.Как видно из названия, у меня проблема с наблюдаемой коллекцией.Я пытаюсь заполнить коллекцию, передав значение через TextBox, а затем добавив его в наблюдаемую коллекцию.Когда я нажимаю кнопку « Добавить Ciudad », появляется текстовое поле для вставки нового значения и кнопка для его сохранения.Значение успешно попадает в метод, отвечающий за это (" Добавить город ввода "), но пользовательский интерфейс никогда не показывает новый элемент.Кстати, первое добавленное вручную значение в « Load Ciudades » отображается правильно.

Я видел несколько связанных вопросов, но все же не смог решить проблему.

Я подозреваю, что неправильно добавляю предметы.Для большего количества проблем я полностью нуб с C #: D.Вот код, по которому можно судить:

Модель городов:

public class Ciudad : INotifyPropertyChanged
{
    private string nombre;

    public String Nombre
    {
        get { return nombre; }

        set {
                nombre = value;
                RaisePropertyChanged("Nombre");
                RaisePropertyChanged("Ciudades"); //Dunno if this one is necesary.
            }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Модель вида городов:

public ObservableCollection<Ciudad> Ciudades { get; } = new ObservableCollection<Ciudad>();

    public void LoadCiudades()
    {
        Ciudades.Add(new Ciudad { Nombre = "Random city" });
    }

    public void AddInputCity(string new_city)
    {
        Ciudades.Add(new Ciudad { Nombre = new_city });
    }

Просмотр городов:

<Grid>
    <DataGrid ItemsSource = "{ Binding Path = Ciudades, UpdateSourceTrigger=PropertyChanged }" Name="DGrid">

    </DataGrid>
    <Button Click="Button_Click" Height="30" Width="150" Margin="0,250,0,0">Add Ciudad</Button></Grid>

Просмотр городов cs

TextBox iTextBox;

    public CiudadesView()
    {
        InitializeComponent();
    }

    private void Add_Input_Text()
    {
        TextBox iText = new TextBox
        {
            Name = "iText",
            Width = 250,
            Margin = new Thickness(100)
        };

        Button saveBtn = new Button()
        {
            Content = "Save"
        };
        saveBtn.Click += new RoutedEventHandler(Button_Save_Click);

        sPanel.Children.Add(iText);
        sPanel.Children.Add(saveBtn);
        iTextBox = iText;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Add_Input_Text();
    }

    private void Button_Save_Click(object sender, RoutedEventArgs e)
    {
        string ciudadNuevoNombre = iTextBox.Text;
        CiudadesViewModel viewModel = new CiudadesViewModel();
        viewModel.AddInputCity(ciudadNuevoNombre);
    }

Есть идеи или предложения?Спасибо вам всем!:)

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы не показали нам свой код клика и некоторые другие вещи, такие как отношения между view и viewmodel.Я предлагаю вам также взглянуть на команды привязки, а не на обработчики кликов.Эта статья предназначена для ознакомления читателя с MVVM, который добавляет элемент в связанную наблюдаемую коллекцию с помощью команды: https://social.technet.microsoft.com/wiki/contents/articles/32164.wpf-mvvm-step-by-step-2.aspx

0 голосов
/ 03 декабря 2018

Убедитесь, что вы вызываете AddInputCity метод существующего экземпляра модели представления в вашем Button_Click обработчике событий, например:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var viewModel = DataContext as YourViewModelClass;
    if (viewModel != null)
        viewModel.AddInputCity("new...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...