0

Я начал изучать .Net MAUI. Делаю Note App под windows. Так же с применением MVVM паттерна, его так же использую впервые. Проблема заключается что я не знаю как реализовать Редактирование ячейки в ListView. Я добавляю элемент в ListView, могу нажать на него и получить информацию, но как Отредактировать ячейки не знаю.

<ListView ItemsSource="{Binding Notes}" ItemTapped="ListView_ItemTapped">
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="{x:Type model:Note}">
                        <TextCell Text="{Binding Title}" Detail="{Binding Detail}" TextColor="#9a26ff"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Вот привязка к ListView

internal partial class NotesViewModel : ObservableObject 
    {
    [ObservableProperty]
    private ObservableCollection&lt;Note&gt; notes = new();

    [ObservableProperty]
    private Note note = new();

    [RelayCommand]
    private void Save(Note? note)
    {
        if (note is null)
        {
            Notes.Add(Note);
            Note = new();

        }
        else
        {
            note = new Note();
        }

    }

}

App

  • Ну, наверно заменить не редактируемый TextCell на что-то, что это позволяет, например, TextBox? И да ItemTapped="ListView_ItemTapped" - это нарушение MVVM, ибо View слой не должен знать про другие слои, про данные, а у вас прям в классе окна вдруг событие в котором вы обрабатываете данные. В MVVM все основывается на привязках, включая все события, которые заменяются командами (ICommand). Конкретно в вашем случае, там достаточно простого ListView SelectedItem="{Binding ...}" (ну или чет аналогичное). – EvgeniyZ Aug 29 '23 at 14:03
  • Я знал что ItemTapped это нарушение, но я просто не знал чем заменить, спасибо. TextCell Мне подходит. При нажатии на кнопку сохранения в ListView добавляется новый TextCell Для просмотра полной его информации нужно на него нажать и его информация отобразиться в соответствующих полях (Title в Title, Detail в Detail) за тем после редактирования и нажатия кнопки сохранения нужно что бы этот TextCell редактировался, а не создавался новый. В вопросе приложу скрин приложения – Studient Aug 29 '23 at 15:46
  • Для начала, зачем вам вообще кнопка "Save", когда вы можете в реал тайме редактировать выделенное, привязав к выделенному объекту, ну или синхронизация. Ну а добавление... Яб на вашем месте сделал 2 текстовых свойства "текст" и "заголовок", привязал к ним поля, которые для редактирования, ну а дальше, при выделении элемента делал бы условно Title = selectedItem.Title; и аналогично так для всех полей, ну а по кнопке "сохранить" делал обратное selectedItem.Title = Title; или добавление нового на основе этих данных. – EvgeniyZ Aug 29 '23 at 16:06
  • Я попробовал что то такое ```[RelayCommand] public void ListView_ItemTapped() {
        }```
    

    Но не знаю что писать в методе. Как обратиться к тому самому "Selected Item". Свойства "Title" и "Detail" у меня есть они уже в {Binding}. Соответственно мне нужно что бы при выделении элемента данные из него отправлялись в эти самые "Title" и "Detail" и Изменялись без нажатия кнопки, это хорошая идея, я в теории понимаю как это, но на практике ничего сварганить не могу(

    – Studient Aug 29 '23 at 17:04
  • ItemTapped - это событие (view часть), которая вам не нужна. Повторю SelectedItem привязываете его к свойству в ViewModel и на его основе делаете нужную логику. Ну а так, как вы используете Community Toolkit для реализации INPC, то вы можете написать метод, который будет вызываться в момент изменения свойства, например public partial OnMySuperProperyChanged(MySuperClass newValue) { //Делаем что-то } – EvgeniyZ Aug 29 '23 at 17:10
  • То есть, у вас в VM должно быть [ObservableProperty] private Note _selectedNote; public partial void OnSelectedNodeChanged(Note? newValue){ // ... } Ну а в XAML <ListView SelectedItem="{Binding SelectedNode}">, все, при клике должен вызываться метод, а в свойстве SelectedNode будет то, что выбрано. Дальше уже делаете остальную логику, например, как сказал ранее Title = SelectedNode.Title;, где Title это привязанное свойство к простому TextBox. – EvgeniyZ Aug 29 '23 at 17:13
  • Подскажите где у меня должна быть реализация partial метода. p.s (У меня ошибка: Отсутствует определяющее объявление для реализующего объявления разделяемого метода...) – Studient Aug 29 '23 at 18:15
  • Вот чтоб таких вопросов не было, я вам советую отказаться от Community Toolkit и реализовать команды и INPC самостоятельно. Ну а так, я вам выше вроде все объяснил где и что должно быть, даже ссылку на документацию дал, не представляю с чего такой вопрос и как еще на него можно ответить. – EvgeniyZ Aug 29 '23 at 18:19
  • У меня ещё явно недостаточно знаний. Спасибо за помощь в моём вопросе! И не знаете ли где есть хороший материал по "MVVM" и Maui. Спасибо – Studient Aug 29 '23 at 18:58
  • MAUI это продвижение WPF, за исключением некоторых аспектов, можете искать любую информацию по WPF и она в 99% будет подходить под MAUI, поймете ее, там уже дотянете знания самого MAUI. Что касательно "хороший материал" - у зарубежных коллег) Очень сильно советую смотреть зарубежные сайты, ютуб каналы, и прочее, Ру сегмент в этом плане посоветует много мусорного, увы. Что конкретно... Мне в свое время очень сильно помогли видео AngelSix, там прям подробнейшие видео по созданию проекта, всякие фишки языка - Nick Chapsas, еще James Montemagno полезности дает, ну а остальное - документация) – EvgeniyZ Aug 29 '23 at 19:07

0 Answers0