2011-03-16 7 views
0

다형성을 사용하는 객체를 편집하기위한 대화 상자를 만들고 싶습니다.그런 대화 상자를 만들기 위해 어떤 디자인 패턴을 사용해야합니까?

MyObject.cs :

using System; 

namespace WpfApplication3 
{ 
    public class MyObject 
    { 
     public string Title { get; set; } 
     public MySettings Settings { get; set; } 
    } 

    public abstract class MySettings 
    { 
     public abstract string GetSettingsString(); 
    } 

    public class MyBoolSettings : MySettings 
    { 
     public bool BoolSetting { get; set; } 

     public override string GetSettingsString() 
     { 
      return "BoolSetting = " + BoolSetting; 
     } 
    } 

    public class MyStringSettings : MySettings 
    { 
     public string StringSetting { get; set; } 

     public override string GetSettingsString() 
     { 
      return "StringSetting = " + StringSetting; 
     } 
    } 
} 

MainWindow.xaml :

<Window x:Class="WpfApplication3.EditMyObjectDialog" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="EditMyObjectDialog" Height="350" Width="350"> 
    <StackPanel Margin="20"> 
     <TextBlock Text="Title" /> 
     <TextBox Name="txtTitle" /> 
     <RadioButton Name="rdBoolSettings" Content="BoolSettings" IsChecked="True" Margin="0, 20, 0, 0" /> 
     <CheckBox Name="chBool" Content="True" Margin="20, 0, 0, 20" /> 
     <RadioButton Name="rdStringSettings" Content="StringSettings" /> 
     <TextBox Name="txtString" Margin="20, 0, 0, 20"/> 
     <Button Content="OK" Click="OK_click" /> 
     <Button Content="Cancel" Click="Cancel_click" Margin="0, 10" /> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs를 : 현재 나는이 패턴을 사용하고

using System.Windows; 

namespace WpfApplication3 
{ 
    public partial class EditMyObjectDialog : Window 
    { 
     public MyObject Result { get; set; } 

     public EditMyObjectDialog(MyObject objectToEdit) 
     { 
      InitializeComponent(); 
      txtTitle.Text = objectToEdit.Title; 
      if (objectToEdit.Settings is MyBoolSettings) 
      { 
       rdBoolSettings.IsChecked = true; 
       chBool.IsChecked = (objectToEdit.Settings as MyBoolSettings).BoolSetting; 
      } 
      if (objectToEdit.Settings is MyStringSettings) 
      { 
       rdBoolSettings.IsChecked = true; 
       txtString.Text = (objectToEdit.Settings as MyStringSettings).StringSetting; 
      } 
     } 

     private void OK_click(object sender, RoutedEventArgs e) 
     { 
      Result = new MyObject() { Title = txtTitle.Text }; 
      if (rdBoolSettings.IsChecked == true) 
       Result.Settings = new MyBoolSettings() { BoolSetting = chBool.IsChecked == true }; 
      if (rdStringSettings.IsChecked == true) 
       Result.Settings = new MyStringSettings() { StringSetting = txtString.Text }; 
      DialogResult = true; 
     } 

     private void Cancel_click(object sender, RoutedEventArgs e) 
     { 
      DialogResult = false; 
     } 
    } 
} 
(210)

ExternalCode : 나는 데이터 등 바인딩 그러니까 기본적으로 나는 두 가지 질문을 사용하여 더 나은 디자인 패턴이 믿지

var f = new EditMyObjectDialog(myObject); 
if (f.ShowDialog() == true) 
    myObject = f.Result; 

.

  1. 에 데이터 바인딩을 설정하는 방법은 사용자가 '확인'을 누를 때까지 개체를 수정 하시겠습니까?
  2. '설정' 속성을 올바르게 처리하는 방법은 무엇입니까? 사용자 이 설정 유형을 전환 할 때 수행 할 작업은 무엇입니까?
+0

, 패턴을 사용의 이점은 쉽게 당신이 참조하는 패턴을 알고있는 다른 개발자에 걸쳐 정보를 얻을 수 있다는 것입니다. 당신은 "나는이 * 패턴을 사용 중입니다."라고 말하지만 어느 것을 지정하지는 마십시오. 이로 인해 모든 코드를 읽으면서 알아낼 수 있습니다. 새로운 패턴을 발명했거나, 패턴을 실제로 사용하지 않거나, 어느 패턴이 좋다고 생각 하는지를 알려줌으로써 더 좋은 점을 얻을 수 있습니다. – Ocelot20

+0

ok는 실제로 '패턴'이 실제로 무엇을 의미하는지 이해하지 못했던 것처럼 보입니다. 내 의미는 "내 실제 코드는 아래의 간단한 예제와 비슷합니다."입니다. – Poma

+0

사용자가 확인을 눌렀을 때만 객체에 데이터를 바인딩하는 방법을 찾았습니까? – Novice

답변

1

내가 당신이 찾고 있다고 생각하는 것은 DataBinding과 DataTemplating의 조합입니다. DataTemplating을 사용하면 서로 다른 비즈니스 개체 (이 경우 MyBooleanSettingsMyStringSettings)에 대해 서로 다른 시각적 요소를 정의 할 수 있습니다 .DataBinding을 사용하면 시각적 요소를 업데이트하고 비즈니스 개체의 데이터를 업데이트 할 수 있습니다.

예 (XAML)는 :

<Window DataContext={Binding RelativeSource={RelativeSource Self}}"> 
    <Window.Resources> 
     <DataTemplate DataType={x:Type local:MyObject}"> 
      <TextBlock Text={Binding Title}" /> 
      <ContentPresenter Content="{Binding Settings}" /> 
     </DataTemplate> 
     <DataTemplate DataType={x:Type local:MyObject}"> 
      <TextBox Text={Binding 
     </DataTemplate> 
     <DataTemplate DataType={x:Type local:MyBoolSettings}> 
      <CheckBox IsChecked="{Binding BoolSetting}" /> 
     </DataTemplate> 
     <DataTemplate DataType={x:Type local:MyStringSettings}> 
      <TextBox Text="{Binding StringSetting}" /> 
     </DataTemplate> 
    </Window.Resources> 
    <ContentPresenter Content="{Binding ObjectToEdit}" /> 
</Window> 

그런 다음 코드에서 뒤에 정의 :

public MyObject ObjectToEdit { get; set; } 

마지막으로 업데이트하여 객체 : 당신이 정말로 제어해야하지만 만약

public class MySettings : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(sting s) 
    { 
     if(PropertyChanged != null) 
     { 
      PropertyChanged(s); 
     } 
    } 
} 

public class BoolSettings : MySettings 
{ 
    bool _value; 

    bool BoolSetting 
    { 
     get { return _value; } 
     set 
     { 
      if(_value != value) 
      { 
       _value = value; 
       OnPropertyChanged("BoolSetting"); 
      } 
     } 
    } 
} 

을 보기와 개체가 동기화되면를 사용해야합니다. 10 해당 속성에 대한 속성. 당신은 몇 가지 추가 읽기를 원하는 경우

내가 추천 : http://msdn.microsoft.com/en-us/library/ms752347.aspx 그들은 항상 말하는 것처럼

0

데이터 바인딩은 간단합니다. MyObject 인스턴스를 만들고 Form의 DataContext 속성에 할당 할 수 있습니다.

this.DataContext=MyObject; 

개별 요소에 대한 바인딩을 정의하십시오.

<TextBox Name="txtTitle" Text="{Binding Path=Title,Mode=TwoWay }" /> 

당신이 UI의 변경으로 객체에 영향을주는 두 가지 방법으로 모드 설정. 한 가지 방법으로 값을 표시합니다.

+0

나는 이런 종류의 바인딩을 이해합니다. 위의 2 가지 주요 질문을 참조하십시오. – Poma

0
  1. 사용자가 '확인'을 누를 때까지 개체를 수정하지 않도록 데이터를 바인딩하는 방법은 무엇입니까?

MyObject 인스턴스의 복사본을 만듭니다. Result 속성 get 메서드에서 사용자가 취소 (변경되지 않은 복사본을 반환)하거나 사용자가 확인을 누르면 변경된 MyObject 인스턴스를 반환합니다.

  1. '설정'속성을 올바르게 처리하는 방법은 무엇입니까? 사용자가 설정 유형을 전환 할 때 수행 할 작업은 무엇입니까?

무슨 문제입니까?

관련 문제