私はMVVMを使用してComboBoxをViewModelにバインドしています。重いアクションと選択の変更についてはほとんど質問がありません。ComboBox選択のアクションが変更されました
選択したアイテムが変更されたときに、いくつかのアクションをトリガーしたいと思っていました。最初の方法は、選択したアイテムがバインドされているフィールドのセッターにロジックを配置することでした。
私の最初の質問は、この良い習慣であるか、より良いアプローチがあるということですか?
これらのアクションは、時間とリソース(Webサービスを通じてデータを取得する必要があります)が非常に高額になる可能性があり、UIがフリーズしないようにするため、最近私はセットからメッセージを送信し始めました。ビューのコードビハインドで受信され、ViewModelコマンドを非同期に呼び出します。
私は時間を無駄にしていますか、これは意味がありますか?
問題は、私がデバッグしているときにUIがフリーズすることがあることです(リリース時には発生しません)。私はそれがデバッガに関連する可能性があることを知って来たここで読んで、誰もVS 2015でこの動作を確認できますか?
要求などの追加情報
私はいくつかの例を提供しています。これが私の最初のアプローチです:
(XAML)
<ComboBox SelectedItem="{Binding SelectedField}"/>
(ViewModelに)
public class ViewModel
{
private MyObject _selectedField = null;
public MyObject SelectedField
{
get
{
return _selectedField;
}
set
{
if(_selectedField != value)
{
// Expensive action
_selectedField = value;
RaisePropertyChanged(() => SelectedField);
}
}
}
}
高価なアクションは、いくつかのWebサービスの呼び出しを行うと長いかかる場合があり、この設計であります良いか、これを達成する良い方法がありますか?
私の第二のアプローチは、この例のようにメッセージを介して、次のとおりです。
(ViewModelに)
public class ViewModel
{
private MyObject _selectedField = null;
public MyObject SelectedField
{
get
{
return _selectedField;
}
set
{
if(_selectedField != value)
{
Messenger.Default.Send(new DoStuffMessage());
_selectedField = value;
RaisePropertyChanged(() => SelectedField);
}
}
}
private RelayCommand _doStuffCommand = null;
public ICommand DoStuffCommand
{
get
{
if (_doStuffCommand == null)
_doStuffCommand = new RelayCommand(async() => await DoStuff());
return _doStuffCommand;
}
}
private async Task DoStuff()
{
// Expensive action
}
}
(コードビハインド)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Messenger.Default.Register<DoStuffMessage>(this, DoStuffMessage_Handler);
}
private void DoStuffMessage_Handler(DoStuffMessage msg)
{
(DataContext as ViewModel).DoStuffCommand.Execute(null);
}
}
が良く、このアプローチですかちょうど悪く無用ですか?
あなたの質問は広すぎます。投稿できるコードがいくつかあり、そのコードについて具体的な質問がありますか? – wdosanjos