[英]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.