0

私はWPFプログラムを書いています.NET 4.5で多くの設定を保持するプログラムを書いていますが、いくつかの問題に直面しています。

たとえば、カメラがあり、実行時にそのカメラ設定の別のインスタンスを作成する必要があるとします。XAMLページには多くのバインディングがあり、2番目のインスタンスでは、その設定のプロパティを保持するそのクラスの新しいインスタンスにバインディングを使用する必要があります(もちろん、正しく考えている場合) 2 つの質問があります。

  1. 可能な限り最小限のコードを記述できるようにバインディングを変更するにはどうすればよいですか (作成されるインスタンスの数がわからないことに注意してください)。

  2. 実行時に各クラスのすべてのインスタンスを保持し、これらのインスタンスを切り替えるときにバインディングを変更する必要があるため、クラスの 2 番目、3 番目などのインスタンスを作成し、メモリ内のオブジェクトを失う方法。

4

1 に答える 1

0

設定を管理および公開するビュー モデルを作成します。追加のプロパティを使用して、現在選択されている設定を提供します。

public class CameraSettings
{
  public string Title { get; set; }
  public bool Grayscale { get; set; }
}

public class CameraViewModel : INotifyPropertyChanged
{
  private CameraSettings _SelectedSettings;
  private List<CameraSettings> _Settings;

  public event PropertyChangedEventHandler PropertyChanged;

  public IEnumerable<CameraSettings> Settings
  {
    get { return _Settings; }
  }

  public CameraSettings SelectedSettings
  {
    get { return _SelectedSettings; }
    set
    {
      if (_SelectedSettings != value)
      {
        _SelectedSettings = value;

        if (PropertyChanged != null)
        {
          PropertyChanged(this, new PropertyChangedEventArgs("SelectedSettings"));
        }
      }
    }
  }

  public CameraViewModel()
  {
    _Settings = new List<CameraSettings>()
    {
      { new CameraSettings() { Title = "BlackWhite", Grayscale = true } },
      { new CameraSettings() { Title = "TrueColor", Grayscale = false } }
    };
  }

}

次に、ビューをこのビュー モデルにバインドできます。ビューの例:

<Window.DataContext>
    <local:CameraViewModel />
</Window.DataContext>

<StackPanel>

    <ComboBox ItemsSource="{Binding Settings}" SelectedItem="{Binding SelectedSettings, Mode=TwoWay}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Title}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <TextBlock Text="{Binding SelectedSettings.Grayscale}" />

</StackPanel>
于 2013-04-17T18:30:12.100 に答える