I want to develop a dialog for editing objects that use polymorphism. I am currently using this template:
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; } } }
ExternalCode:
var f = new EditMyObjectDialog(myObject); if (f.ShowDialog() == true) myObject = f.Result;
I believe that there is a much better design template that uses data binding, etc. So basically I have two questions.
- How to make data binding not to change the object until the user clicks "OK"?
- How to properly handle the "Settings" property? What to do when user type switch settings?
source share