まず第一に、それはばかげた質問ではありません。ほとんどの MVVM スターターは winforms から来ており、winforms のプラクティスを取り入れてコード ビハインドに取り組む傾向があるのは普通のことです。あとは、それを忘れて MVVM を考えるだけです。
質問に戻ると、VM が処理している辞書があり、ビューからその辞書にアクセスしています。ビューは、バインディングを介する場合を除いて、ビューモデルについて何も考えてはいけません。
ビューモデルに変更があったときにウィンドウを点滅させることは、私には付属の動作のように聞こえます。ここでは、添付された動作についてよく読んでください。
http://www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF
簡単にするために、あなたのケースに何らかの形で関連する非常に単純な例を挙げようと思います。
何かを追加するたびにメッセージボックスが画面に表示される IEnumerable があるアタッチされた動作クラスを作成します。メッセージボックスのコードを、通知時に実行したい点滅アニメーションに変更するだけです。
public class FlashNotificationBehavior
{
public static readonly DependencyProperty FlashNotificationsProperty =
DependencyProperty.RegisterAttached(
"FlashNotifications",
typeof(IEnumerable),
typeof(FlashNotificationBehavior),
new UIPropertyMetadata(null, OnFlashNotificationsChange));
private static void OnFlashNotificationsChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var collection = e.NewValue as INotifyCollectionChanged;
collection.CollectionChanged += (sender, args) =>
{
if (args.Action == NotifyCollectionChangedAction.Add)
{
foreach (var items in args.NewItems)
MessageBox.Show(items.ToString());
}
};
}
public static IEnumerable GetFlashNotifications(DependencyObject d)
{
return (IEnumerable)d.GetValue(FlashNotificationsProperty);
}
public static void SetFlashNotifications(DependencyObject d, IEnumerable value)
{
d.SetValue(FlashNotificationsProperty, value);
}
}
ビューモデルでは、ObservableCollection プロパティを作成できます。監視可能なコレクションが必要なので、コレクション変更イベント通知があります。テストできるように、追加するためのコマンドも追加しました。
public class MainViewModel : ViewModelBase
{
ObservableCollection<string> notifications;
public ObservableCollection<string> Notifications
{
get { return notifications; }
set
{
if (notifications != value)
{
notifications = value;
base.RaisePropertyChanged(() => this.Notifications);
}
}
}
public ICommand AddCommand
{
get
{
return new RelayCommand(() => this.Notifications.Add("Hello World"));
}
}
public MainViewModel()
{
this.Notifications = new ObservableCollection<string>();
}
}
ビューモデルから通知プロパティにバインドできるビューを次に示します。
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfApplication7.ViewModel"
xmlns:local="clr-namespace:WpfApplication7"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainViewModel />
</Window.DataContext>
<Grid>
<StackPanel>
<ListBox ItemsSource="{Binding Notifications}"
local:FlashNotificationBehavior.FlashNotifications="{Binding Notifications}"></ListBox>
<Button Command="{Binding AddCommand}" >Add Something</Button>
</StackPanel>
</Grid>
ObservableCollection に何かを追加するたびに、コレクションに何かが追加されたことをユーザーに通知するメッセージ ボックスが表示されます。
私はあなたの問題に役立ったことを願っています。説明が必要な場合は教えてください。