2013-04-17 2 views
0

WPF 프로그램을 작성하면서 .NET 4.5에서 많은 설정을 저장할 프로그램을 작성하고 몇 가지 문제가 있습니다.런타임시 바인딩 변경 및 클래스 인스턴스 WPF 저장

예를 들어 카메라가있어서 런타임에 카메라 설정의 다른 인스턴스를 만들어야합니다. XAML 페이지의 경우 많은 바인딩이 있고 두 번째 인스턴스의 경우 해당 설정에 대한 속성을 보유하고있는 해당 클래스의 새 인스턴스에 대한 사용 바인딩을 지울 필요가 있습니다 (물론 올바르게 생각하는 경우). 이 두 질문 :

  1. 어떻게 내 나는 가능한 한 최소한의 코드를 쓸 수 있도록 (내가 생성됩니다 얼마나 많은 인스턴스 모른다 명심하시기 바랍니다) 바인딩을 변경합니까?

  2. 런타임 중에 각 클래스의 모든 인스턴스를 보유하고 이러한 인스턴스를 전환하는 동안 바인딩을 변경해야하기 때문에 클래스의 두 번째, 세 번째 등 인스턴스를 만들고 메모리에서 개체를 잃을 수 있습니다.

+0

현재 코드와 XAML을 게시하십시오. –

답변

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> 
+0

답변 주셔서 감사 합니다만, 페이지의 datacontext를 변경하고 List <>를 사용하여 인스턴스를 처리합니다. – Denis