I'm writing a program that dynamically creates Control based on the data type of the properties extracted using reflection. Here is the view in subject for examination.
    <ListView ItemsSource="{Binding PropertyControls}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Margin="8">
                    <TextBlock Text="{Binding PropertyName}" FontSize="14" Width="400"></TextBlock>
                    <UserControl FontSize="14" Content="{Binding Path=PropertyValue, Converter={StaticResource PropertyValueConverter}}"></UserControl>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
I created an item template for the items in ListView. Each row consists of two elements; the label and the dynamically created control.
For instance, if the PropertyValue is a boolean, then the dynamically created control will be a checkbox. If the PropertyValue is a string, then the dynamically created control will be a TextBox. If the PropertyValue is a list of FileInfo, then a separate window will be created with another ListView and browse button with OpenFileDialog.
I was able to accomplish the dynamically created control by creating a class that implements IValueConverter and which is utilized as specified in the XAML. The PropertyValueConverter converts the PropertyValue into a dynamically created control by inspecting its data type.
My problem is when the CheckBox is checked, there was no event raised and the ViewModel is not modified by its changes. I suspect because the binding in the XAML was made to the UserControl and not to its child control which happens to be a CheckBox. Although it is possible to bind the IsChecked programmatically in the PropertyValueConverter, is there a better way to solve this?
------- Revision 1 -------
public class PropertyControl: INotifyPropertyChanged
{
    public string PropertyName { get; set; }
    private object propertyValue;
    public object PropertyValue
    {
        get { return propertyValue; }
        set
        {
            propertyValue = value; 
            OnPropertyChanged(nameof(PropertyValue));
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}
/// <summary>
/// Dynamically converts between value and control given a data type - control mapping.
/// </summary>
class PropertyValueConverter: IValueConverter
{
    /// <summary>
    /// Converts from value to control.
    /// </summary>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof (int))
            return new NumberTextBox {Text = value.ToString()};
        if (targetType == typeof (string))
            return new TextBox {Text = value.ToString()};
        if (targetType == typeof (bool))
            return new CheckBox {IsChecked = (bool) value};
        throw new Exception("Unknown targetType: " + targetType);
    }
    /// <summary>
    /// Converts from control to value.
    /// </summary>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof (NumberTextBox))
            return (value as NumberTextBox).Value;
        if (targetType == typeof(TextBox))
            return (value as TextBox).Text;
        if (targetType == typeof(CheckBox))
            return (value as CheckBox).IsChecked;
        throw new Exception("Unknown targetType: " + targetType);
    }
}
------- Revision 2 -------
public partial class SettingsWindow : Window
{
    public BindingList<SettingViewModel> ViewModels { get; set; }
    private SettingsManager settingsManager = new SettingsManager(new SettingsRepository());
    public SettingsWindow()
    {
        InitializeComponent();
        // Reloads the data stored in all setting instances from database if there's any.
        settingsManager.Reload();
        // Initialize setting view model.
        ViewModels = SettingViewModel.GetAll(settingsManager);
    }
    private void ResetButton_OnClick(object sender, RoutedEventArgs e)
    {
        settingsManager.Reload();
    }
    private void SaveButton_OnClick(object sender, RoutedEventArgs e)
    {
        settingsManager.SaveChanges();
    }
}
--- Tab Control ---
<TabControl Name="ClassTabControl" TabStripPlacement="Left" ItemsSource="{Binding ViewModels}">
    <TabControl.Resources>
        <utilities:PropertyValueConverter x:Key="PropertyValueConverter" />
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}" 
                       Margin="8" FontSize="14"></TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <ListView ItemsSource="{Binding PropertyControls}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="8">
                                <TextBlock Text="{Binding PropertyName}" FontSize="14" Width="400"></TextBlock>
                                <CheckBox FontSize="14" IsChecked="{Binding Path=PropertyValue, Converter={StaticResource PropertyValueConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></CheckBox>
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
                <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="8" HorizontalAlignment="Center">
                    <Button Name="ResetButton" Padding="4" Content="Reset" FontSize="14" Margin="4"
                            Click="ResetButton_OnClick"></Button>
                    <Button Name="SaveButton" Padding="4" Content="Save" FontSize="14" Margin="4"
                            Click="SaveButton_OnClick"></Button>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
 
     
     
    
