簡體   English   中英

為什么我得到一個無效的轉換異常(“指定的轉換無效。”)?

[英]Why am I getting an invalid cast exception ('Specified cast is not valid.')?

選中復選框時,我試圖從列表中刪除一個項目。 我使用 input.kit 作為復選框。 我已經能夠使用圖像按鈕將它們刪除,但不能使用此復選框。 這是 xaml:

<ListView ItemsSource="{Binding TodoListItems}" x:Name="todoList">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <FlexLayout JustifyContent="SpaceBetween" Padding="20,0">
                            <ContentView>
                                <FlexLayout AlignItems="Center" >
                                    <input:CheckBox IsChecked="{Binding Complete}" 
                                                    CheckChangedCommand="{Binding Path=BindingContext.CompleteTodoCommand, Source={x:Reference todoList}}"
                                                    CommandParameter="{Binding .}"
                                                    />
                                    <Label Text="{Binding TodoText}" Padding="10,0,0,0" FontSize="Large"/>
                                </FlexLayout>
                            </ContentView>
                            
                            <ImageButton Source="trash_icon.png" 
                                         Command="{Binding Path=BindingContext.RemoveTodoCommand, Source={x:Reference todoList}}"
                                         CommandParameter="{Binding .}"
                                         Scale="1.2" BackgroundColor="White"
                                         />
                            
                        </FlexLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
            
        </ListView>

這是 ViewModel:

    {
        private ObservableCollection<TodoItem> todoListItems;

        
        public ObservableCollection<TodoItem> TodoListItems
        {
            get { return todoListItems; }
            set { todoListItems = value; }
        }

        private ObservableCollection<TodoItem> completedTodoItems;

        public ObservableCollection<TodoItem> CompletedTodoItems
        {
            get { return completedTodoItems; }
            set { completedTodoItems = value; }
        }



        public TodoListViewModel()
        {
            todoListItems = new ObservableCollection<TodoItem>();
            TodoListItems.Add(new TodoItem("Walk the duggo",false));
            TodoListItems.Add(new TodoItem("Do the washing",false));
            TodoListItems.Add(new TodoItem("Brush off Cheeto dust",false));

            CompletedTodoItems = new ObservableCollection<TodoItem>();
        }
        public ICommand AddTodoCommand => new Command(AddTodoItem);
        public string NewTodoInputValue { get; set; }
        void AddTodoItem() 
        {
            TodoListItems.Add(new TodoItem(NewTodoInputValue));
        }

        public ICommand RemoveTodoCommand => new Command(RemoveTodoItem);
        
        void RemoveTodoItem(object o)
        {
            TodoItem todoItemBeingRemoved = o as TodoItem;
            TodoListItems.Remove(todoItemBeingRemoved);
        }

        public ICommand CompleteTodoCommand => new Command(CompleteTodo);

        void CompleteTodo(object o) 
        {
            
            TodoItem todoItemCompleted = o as TodoItem;
            todoListItems.Remove(todoItemCompleted);

            CompletedTodoItems.Add(todoItemCompleted);
        }

    }

全視圖 model。 我已經檢查了 observable 集合是否已經初始化等等。 此外,AddToDo 和 RemoveTodo 命令也有效。

0x1C in TodoAppXamarin.ViewModels.TodoListViewModel.CompleteTodo at C:\Users\johns\source\repos\TodoAppXamarin\TodoAppXamarin\TodoAppXamarin\ViewModels\TodoListViewModel.cs:64,4
at C:\Users\johns\source\repos\TodoAppXamarin\TodoAppXamarin\TodoAppXamarin\ViewModels\TodoListViewModel.cs(64)

那堆棧跟蹤?

CompletedTodoItems.Add不接受類型TodoItem 嘗試隱式轉換為正確的類型,但TodoItem不兼容。

根據您的代碼,我創建了一個演示,但我無法重現此問題。

由於我看不到TodoItem的代碼,所以我創建了一個 class TodoItem.cs如下:

public class TodoItem 
    {
        public string TodoText { get; set; }

        public bool Complete { get; set; }
        public TodoItem(string text,bool ischecked) { 
          this.TodoText = text;    
          this.Complete = ischecked;
        }
    }

另外,因為 class TodoItem沒有單參數構造函數,所以我替換了你的代碼:

    void AddTodoItem() 
    {
        TodoListItems.Add(new TodoItem(NewTodoInputValue));
    }

void AddTodoItem()
    {   // add a value for the second parameter 
        TodoListItems.Add(new TodoItem(NewTodoInputValue,false));
    }

TodoListViewModel.cs的整個代碼是:

   public class TodoListViewModel 
{
    private ObservableCollection<TodoItem> todoListItems;


    public ObservableCollection<TodoItem> TodoListItems
    {
        get { return todoListItems; }
        set { todoListItems = value; }
    }

    private ObservableCollection<TodoItem> completedTodoItems;

    public ObservableCollection<TodoItem> CompletedTodoItems
    {
        get { return completedTodoItems; }
        set { completedTodoItems = value; }
    }



    public TodoListViewModel()
    {
        todoListItems = new ObservableCollection<TodoItem>();
        TodoListItems.Add(new TodoItem("Walk the duggo", false));
        TodoListItems.Add(new TodoItem("Do the washing", false));
        TodoListItems.Add(new TodoItem("Brush off Cheeto dust", false));

        CompletedTodoItems = new ObservableCollection<TodoItem>();
    }
    public ICommand AddTodoCommand => new Command(AddTodoItem);
    public string NewTodoInputValue { get; set; }
    void AddTodoItem()
    { // add a value for the second parameter 
        TodoListItems.Add(new TodoItem(NewTodoInputValue,false));
    }

    public ICommand RemoveTodoCommand => new Command(RemoveTodoItem);

    void RemoveTodoItem(object o)
    {
        TodoItem todoItemBeingRemoved = o as TodoItem;
        TodoListItems.Remove(todoItemBeingRemoved);
    }

    public ICommand CompleteTodoCommand => new Command(CompleteTodo);

    void CompleteTodo(object o)
    {

        TodoItem todoItemCompleted = o as TodoItem;
        todoListItems.Remove(todoItemCompleted);

        CompletedTodoItems.Add(todoItemCompleted);
    }
}




 

暫無
暫無

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

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