collectionview包含一个编辑器,如何通过编辑器中的更改来更改ViewModel中的文本#maui

问题描述 投票:0回答:1

当用户在编辑器中更改文本时,我需要将更改显示在 私有MessageModel消息模型,与添加新消息的按钮相同

 <CollectionView ItemsSource="{Binding MessageModels.messege}"
                 x:Name="collectionView">
     <CollectionView.Header>
         <HorizontalStackLayout HorizontalOptions="Center" >
             <Label TextColor="Black" Text="Messages" VerticalOptions="Center"></Label>
             <Button MinimumWidthRequest="10"
                     MinimumHeightRequest="10"
                     Command="{Binding  addNewmessageCommand}"
                     Text="Add New message"></Button>

         </HorizontalStackLayout>
     </CollectionView.Header>
     <CollectionView.ItemTemplate>
         <DataTemplate>
             <HorizontalStackLayout Padding="2">
                 <Editor AutoSize="TextChanges" Text="{Binding . }"  WidthRequest="300" FontSize="16" TextColor="#1565C0" />
                 <Button Background="Red"
                         Command="{Binding Source={x:Reference collectionView}, Path=BindingContext.DeleteCommand}"
                         CommandParameter="{Binding .}"
                         Text="X" />
             </HorizontalStackLayout>
         </DataTemplate>
     </CollectionView.ItemTemplate>
 </CollectionView>

我尝试使用 INotifyPropertyChanged,但也没有帮助

 public partial class MessageModelEllementVM : CommunityToolkit.Mvvm.ComponentModel.ObservableObject
 {
     AddNewWayD addNewWayD;
     public event PropertyChangedEventHandler PropertyChanged;
     public MessageModelEllementVM(  MessageModel messageModel,   List<string> ways,int gridPosition, AddNewWayD addNewWay)
     {
         this.addNewWayD = addNewWay;
         this.messageModels = messageModel;
         GridPosition = gridPosition;
         photoURL = "фото не выбрали";
         dialogimage = new Image();
         messageModels.Plot_twist.ToList().ForEach(i => plot_twist += "," + i.ToString());
         answers = AnswerTextConverter.Convert(messageModels.AnswerText, ways);
     }

     

     public MessageModelEllementVM()
     {
         this.messageModels = new MessageModel();
         dialogimage = new Image();
     }

     private int GridPosition;


     [ObservableProperty]
     public ObservableCollection<AnswerText> answers;
 
     [ObservableProperty]
     Image dialogimage;
     FileResult? uploadedFile;

     [ObservableProperty]
     string plot_twist;
     [ObservableProperty]
     private MessageModel messageModels;

 
   

     [ObservableProperty]
     string photoURL;
     [RelayCommand]

    public void AddWay()
     {
         //addNewWayD(GridPosition,messageModels);
    
     }
     [RelayCommand]
     async void AddImge()
     {
         
         uploadedFile = await MediaPicker.PickPhotoAsync();

         if (uploadedFile != null)
         {
             dialogimage.Source= uploadedFile.FullPath;
         }


     }
     [RelayCommand]
     void addNewmessage()
     {
         messageModels.messege.Add(string.Empty);
     }
 
     [RelayCommand]
     private  void Delete(string text)
     {
        foreach (var item in messageModels.messege)
         {
             if (item == text)
             {
                 messageModels.messege.Remove(item);
                 break;
             }
         }

     }
 }

Code MessageModel 我也尝试在那里添加事件,但没有帮助

 public class MessageModel{ 
        public MessageModel() {
                Plot_twist = new List<int>();
                messege = new ObservableCollection<string>();
                AnswerText = new ObservableCollection<(string Answer, List<int> way)>();
        }
    
        public List<MessageModel> messageModel = new List<MessageModel>();
        public List<int> Plot_twist { get; set; } //номер диалога по типу  ["0","1","1"] - глава 0 подветка 1 в подветке подветка 1
        public ObservableCollection<string> messege { get; set; } //сообщения от Алисы (массив чтобы несколько подряд ) 
        public string photoURL { get; set; }
    
    
        public ObservableCollection<(string Answer, List<int> way)> AnswerText; //way - адрес на продолжение 
    
    }```
I need the data to change, but I'm still a beginner and I don't understand how to do it. 
can you please explain how it works and what ways it can be fixed

c# mvvm maui collectionview
1个回答
0
投票

您的编辑器的 Text 属性绑定到纯字符串。数据绑定不会更改对象本身(在您的情况下是字符串),它们会更改对象的属性。这就是为什么您需要绑定到某种属性。
解决此问题的最简单方法是为您的消息实现一个带有字符串属性的包装类:

public class Message
{
    //note that binding to object's fields also doesn't work:
    //this works
    public string Text { get; set; }

    //this - does not!
    //public string Text;

    public Message(string text)
    {
        Text = text;
    }
}

并且像这样使用它

public ObservableCollection<Message> messege { get; set; }

在 MessageModelElementVM 中,并且
<Editor Text="{Binding Text }" ... />

在 xaml 中

此外,无需在

foreach
命令中使用
Delete
。离开
<Button CommandParameter="{Binding .}" ... />

照原样并将命令更改为:

[RelayCommand]
private void Delete(Message msg)
{
    messageModels.messege.Remove(msg);
}

这将删除您在

CommandParameter

中传递的确切对象
© www.soinside.com 2019 - 2024. All rights reserved.