0

私は3つのC#クラスA、B、Cを持っています

  • A は ViewModel です
  • Bはモデルです
  • Cは状態クラスです(IsConnectedなど、デバイスに関するいくつかの状態情報を含みます)

これらは、B がタイプ C のプロパティを持つように接続されています。C には、デバイスの状態を表すほぼ 30 のプロパティが含まれています。私は B が INotifyPropertyChanged を介して A を更新できるようにすることに決めました。現在、C のプロパティが変更されたときに A に通知する方法を探しています。

これを達成する最も簡単な方法は何ですか?

アップデート:

このコードはトリックを行います。

class Gun : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public GunState GunState { get; private set; }

    public Gun()
    {
        GunState = new GunState();
        GunState.PropertyChanged += GunStateOnPropertyChanged;
    }

    private void GunStateOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        NotifyPropertyChanged(propertyChangedEventArgs.PropertyName);
    }

    protected virtual void NotifyPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

class GunState : INotifyPropertyChanged
{
    private bool _isLoaded;
    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsLoaded
    {
        get { return _isLoaded; }
        private set
        {
            if (_isLoaded != value)
            {
                _isLoaded = value;
                NotifyPropertyChanged("IsLoaded");
            }
        }
    }

    public void SimulateLoadGun(bool isLoaded)
    {
        IsLoaded = isLoaded;
    }

    protected virtual void NotifyPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

}

class GunViewModel : INotifyPropertyChanged
{
    private readonly Gun _gun;

    public GunViewModel()
    {
        _gun = new Gun();
        _gun.PropertyChanged += OnGunOnPropertyChanged;
    }

    public string IsLoaded
    {
        get { return _gun.GunState.IsLoaded ? "Gun is loaded!" : "Gun is not loaded."; }
    }

    private void OnGunOnPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        NotifyPropertyChanged(args.PropertyName);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void NotifyPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public void LoadGun()
    {
        _gun.GunState.SimulateLoadGun(!_gun.GunState.IsLoaded);
    }
}

XAML:

<Window x:Class="ModelViewModelInteraction.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:ModelViewModelInteraction"

        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:GunViewModel x:Name="_model" />
    </Window.DataContext>

    <Grid>
        <Label Content="{Binding IsLoaded}" Margin="0,0,313,262" />
        <Button Content="Load gun" Click="Button_Click_1" Margin="73,83,283,59" />
    </Grid>
</Window>

XAML.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        _viewModel = new GunViewModel();
        DataContext = _viewModel;
    }

    private GunViewModel _viewModel;

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        _viewModel.LoadGun();
    }
}
4

1 に答える 1

1

私はデメテルの法則に従います。Aで何が起こっているかについての知識は必要ありませんC。むしろ、関連するプロパティが変更されたときAからの通知を監視する必要があります。BC

たとえば、モデルはB独自のIsConnectedプロパティを持つことができ、INotifyPropertyChangedメカニズムを引き続き使用できます。

于 2013-04-11T18:32:45.113 に答える