我試圖在這裏效仿:如何在ItemTemplate是用戶控件時從ListView中正確刪除項目?
WPF ListBox with self-removing items
這是有道理的,但我的問題是,ListView控件本身是確定所使用的模板。所以它可以輕鬆地定製綁定指向正確的目標。然而,我正在使用MVVM,並且正在努力將兩者融合在一起。
例如,如果模板是:
<ListBox.ItemTemplate>
<DataTemplate>
<local:MyItemView/>
</DataTemplate>
</ListBox.ItemTemplate>
這突然變得更加困難,因爲理想情況下,我想重用沒有硬編碼綁定了這一觀點。
我試圖用DependencyProperty
來通過List
和Element
,所以我可以通過命令刪除它。
<ListBox.ItemTemplate Name="myList">
<DataTemplate>
<local:MyItemView TheList={Binding ElementName=myList, Path=DataContext.List} TheElement={Binding}/>
</DataTemplate>
</ListBox.ItemTemplate>
不過,我有綁定錯誤告訴我它無法從MyClassViewModel
轉換值TheElement
到MyClass
。即使我評論說總是NULL。
基本上我想:
class MyDataClass { // pretend there's more here}
class MyDataClassContainer
{
public ObservableCollection<MyDataClass> Items;
public void Add(MyDataClass);
public void Remove(MyDataClass);
}
class MyDataClassEntryViewModel
{
public static readonly DependencyProperty ListItemProperty = DependencyProperty.Register("TheClass", typeof(MyDataClass), typeof(MyDataClassEntryViewModel));
public static readonly DependencyProperty ListContainerProperty = DependencyProperty.Register("TheContainer", typeof(MyDataClassContainer), typeof(MyDataClassEntryViewModel));
public MyDataClass TheClass;
public MyDataClassContainer TheContainer;
public ICommand Delete = new DelegateCommand(RemoveItem);
private function RemoveItem(object parameter)
{
TheContainer.Remove(TheClass);
}
}
用下面的模板:
MyDataClassEntryView.xaml
<UserControl>
<Grid>
<Button Content="Delete" Command="{Binding Path=Delete}"/>
</Grid>
</UserControl>
MyDataContainerView.xaml
<UserControl>
<ListView x:Name="listView" ItemsSource="{Binding Path=Container.Items}">
<ListView.ItemTemplate>
<DataTemplate>
<local:MyDataClassEntryView TheClass="{Binding}" TheContainer="{Binding ElementName=listView, Path=DataContext.Container}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</UserControl>
注:I H AVE省略了大部分多餘的線條,因爲我試圖得到一個我可以在任何地方使用的通用答案。不是硬編碼的單一解決方案。我基本上想要保持MVVM結構強大,沒有大量的硬編碼和佈線在後臺。我想盡可能地使用XAML。
我所看到的從列表中移除的所有其他方法都需要各種假設,例如使用SelectedIndex/Item,或者使用ContainerView上的方法將元素作爲參數來投射它,然後刪除等等。簡而言之,大多數解決方案對於給定的例子來說太難編碼了。感覺就像在WPF中應該有一個簡單的方法來實現這一點。
由於ListView會自動創建我的子ViewModel/Views的實例,所以我不可能明顯得到任何數據。基本上,我只想使用綁定傳遞參數。
嗯,即使如此,我仍然看到'null'在我的ViewModel – mGuv