在我的應用程序模型中,我有一個字符串列表。在我的視圖模型中,我有一個ObservableCollection<string>
,它使用我的模型列表進行初始化。我想將列表與我的可觀察集合同步,所以當我們更改它時,它也會更改列表。同時更改兩個列表
我想出了兩種方法來實現這一目標:
- 做出看起來像我的觀察的集合名單的包裝。
- 使用模型中的列表初始化新的可觀察集合,並附加
CollectionChanged
事件的事件處理程序。
對於第一種方式:
對於第二:
var list = new List<string>{ "aba", "abacaba" };
var obscol = new ObservableCollection<string>(list);
obscol.CollectionChanged += (s,e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
list.Add((string)e.NewItems[0]);
}
// etc
}
obscol.Add("test");
//now list has "aba", "abacaba", "test"
我認爲第二種方式是不好的,因爲新的觀察集合創建和複製的所有項目從列表中進入這個新的可觀察收藏。但是在第一種情況下,列表元素不會被複制。
我應該選擇哪種方式?
編輯:
在我的應用程序模型我的電子郵件列表(簡化字符串列表)。 查看具有與列表中的項目綁定到可觀察集合的列表框。
當用戶按下某個按鈕時,電子郵件從可觀察集合中刪除,也從應用程序模型的列表中刪除。
編輯2:
模型
public class Model
{
public List<string> List { get; set; }
}
查看模型
public class VM
{
public Model _model;
public ObservableWrapper<string> WrapperList { get; set; }
public VM(Model model)
{
_model = model;
WrapperList = new ObservableWrapper<string>(_model.List);
Command = new DelegateCommand<object>(CommandExecuted);
}
public DelegateCommand<object> Command { get; }
private void CommandExecuted(object obj)
{
WrapperList.RemoveAt(0); //0 for example and simplify
}
}
public class DelegateCommand<T> : System.Windows.Input.ICommand
{
private readonly Predicate<T> _canExecute;
private readonly Action<T> _execute;
public DelegateCommand(Action<T> execute) : this(execute, null) { }
public DelegateCommand(Action<T> execute, Predicate<T> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute?.Invoke((T)parameter) ?? true;
}
public void Execute(object parameter)
{
_execute((T)parameter);
}
public event EventHandler CanExecuteChanged;
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
檢視/ XAML
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ListBox ItemsSource="{Binding WrapperList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Command="{Binding Command}"
Grid.Row="1"/>
</Grid>
查看/代碼
public partial class MainWindow : Window
{
public MainWindow()
{
var model = new Model();
model.List = new List<string> { "11", "22","33","44" };
DataContext = new VM(model);
InitializeComponent();
}
}
給你一個理由說明你爲什麼需要/需要保持原始列表?我採用第二種方法。 –
查看更新後的帖子 – snipervld
如果您正確執行mvvm模式,則從視圖模型中的可觀察集合中刪除項目應該足夠了。 –