Binding RadioButtons with Gender Property in WPF Using Value Converter

Many WPF developers face a common problem when working with RadioButtons . They try to bind RadioButtons with a Gender property, but the binding does not work as expected . Why does this happen? Because RadioButtons work with true/false values , but in real applications, Gender is stored as meaningful values like: Male Female So the big question is: How do we connect a true/false UI control with a Male/Female data value? Why RadioButton Binding Fails A RadioButton uses the IsChecked property, and this property accepts only: true false But your Gender property is usually: a string ( "Male" , "Female" ) or an enum So the UI value and the data value are different types . This mismatch is the root cause of the problem. The Solution: Value Converter WPF provides a powerful feature called a Value Converter . What is a Value Converter? A Value Converter converts one value type into another. In our case: Convert Gender (...

Validation By IDataErrorInfo in Wpf using MVVM

<Window x:Class="WpfPrismTutorial.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfPrismTutorial"
        mc:Ignorable="d"
        prism:ViewModelLocator.AutoWireViewModel="True"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:valid="clr-namespace:WpfPrismTutorial.Validations"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <ControlTemplate x:Key="errorTemplate">
            <StackPanel Orientation="Horizontal">
            <AdornedElementPlaceholder x:Name="ErrorHolder" >
                <Border BorderBrush="red" BorderThickness="1" />
            </AdornedElementPlaceholder>
            <TextBlock  Text="{Binding [0].ErrorContent}" VerticalAlignment="Center" HorizontalAlignment="Right" Foreground="Red"/>
        </StackPanel>

        </ControlTemplate>
    </Window.Resources>
    <Grid VerticalAlignment="Center" HorizontalAlignment="Left">

        <StackPanel Orientation="Horizontal" Grid.Row="3">
            <TextBlock Text="Validation by IDataErrorInfo  " Margin="5,5"/>
            <TextBox Text="{Binding MainWindowModel.ValidationByIDataErrorInfo,UpdateSourceTrigger=PropertyChanged,
                        ValidatesOnDataErrors=True}" Validation.ErrorTemplate="{StaticResource errorTemplate}"  Height="30" Width="300"/>
        </StackPanel>
    </Grid>

</Window>

ViewModel

 public class MainWindowViewModel : BindableBase
    {
        private MainWindowModel mainWindowModel = new MainWindowModel();

        public MainWindowModel MainWindowModel
        {
            get { return mainWindowModel; }
            set { SetProperty(ref mainWindowModel, value); }
        }
 }

Model

  public class MainWindowModel : BindableBase, IDataErrorInfo
    {
        #region Validation By IDataErrorInfo

        private string _validationByIDataErrorInfo = string.Empty;

        public string ValidationByIDataErrorInfo
        {
            get { return _validationByIDataErrorInfo; }
            set
            {
                SetProperty(ref _validationByIDataErrorInfo, value);
            }
        }
        #endregion


        public string Error { get; }

        public string this[string columnName]
        {
            get
            {
                if (columnName == "ValidationByIDataErrorInfo")
                    return "Validation By IDataErrorInfo should not empty";
                return string.Empty;
            }
        }
    }

Comments

Popular posts from this blog

Filter DataGrid and ListView in wpf using ICollectionView

Pagination of DataGrid in WPF using MVVM

How to Create TabControl using Prism Region