私は2つの異なるViewModelクラスに公開するModelクラスに静的なboolプロパティを持っています。これらのViewModelの1つは、前記静的プロパティにリンクされたboolプロパティを有し、コンバータを介してボタンの可視性に拘束される。 ViewModel内でこれをtrueまたはfalseに設定すると、ボタンの可視性がそれに応じて変更されます。 (このViewModelのインスタンスは、ボタンが存在するDataContext経由でビューのXAMLに設定されています) 別のビュー内からこのボタンの可視性を変更したいと思っていました。別のViewのViewModelも元のモデルの静的ブールにリンクされていますが、これを行うことはできますが、何もしていません。バインディング時の静的フィールドの問題
ここに私のコードです:
MainModel
public class MainModel
{
static bool _ButtonIsVisible = true;
public static bool ButtonIsVisible
{
get { return _ButtonIsVisible; }
set { _ButtonIsVisible = value; }
}
}
MainViewModel
class MainViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
MAINVIEW
<Window x:Class="MVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:MVVM"
mc:Ignorable="d"
Title="MainWindow" Width="1920" Height="1080" WindowState="Maximized" WindowStyle="None">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<Button Visibility="{Binding ButtonIsVisible, Converter={StaticResource BoolToVisConverter}}" />
</Window>
MainViewModelからのButtonIsVisibleがコマンド内で変更され、期待どおりに動作します。これは私のトラブルが起こる場所です。
AnotherViewModel
class AnotherViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
AnotherViewModelのインスタンスは、それがビューに対応していますし、コマンドは私がAnotherViewModelからButtonIsVisibleプロパティを変更するこのビュー内のボタンにバインドされ、時のDataContextのを介して作成されます私のMainViewからのボタンが、MainModelの静的プロパティから両方のViewModelが取得してプロパティの値を取得して設定しているのを見て、私のボタンがMainViewから変更されると思いますが、これは機能しません。 誰かが私が間違っていることを教えてもらえますか?
これはなぜ機能していないのかわかりませんが、これを行うには静的なプロパティを使用して私には本当に悪いと思います。私は 'AnotherViewModel'から' MainViewModel'' ButtonIsVisible'プロパティを変更したいと思います。コンストラクタの 'AnotherViewModel'に' MainViewModel'インスタンスを送るかもしれません。 – Pikoh
私はそれについて考えて、 'AnotherViewModel'では' RaisePropertyChanged'を呼びますが、 'MainView'ではなく' AnotherViewModel'のビューに影響します。 'MainView'はプロパティ変更イベントを取得していません... – Pikoh
私は自分自身もこれを行うために静的プロパティを使用するのが嫌いです。私は後でより良い方法を見つけるかもしれませんが、私は今ボールを転がすためにこれで行くつもりです。 2番目のコメントは意味がありますが、これを回避する方法はありますか? 'AnotherViewModel'で行われた変更の' MainViewModel'を通知できますか? –