Reputation: 687
I'm just getting started with WPF and particularly Validations and DataBinding.
This is my XAML code
<Window x:Class="simpledatagrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="IDDATA" Height="350" Width="525">
<Grid >
<DataGrid SelectionChanged="Iddetails" Name="dgsample" BorderBrush="Black" BorderThickness="2" AutoGenerateColumns="True" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="False" Margin="200,10,10,75"></DataGrid>
<Label Content="ID :" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="27"/>
<Label Content="Name :" HorizontalAlignment="Left" Margin="10,60,0,0" VerticalAlignment="Top" Height="26" Width="48"/>
<Label Content="Salary :" HorizontalAlignment="Left" Margin="10,110,0,0" VerticalAlignment="Top" Height="26" Width="47"/>
<TextBox Name="tb1" HorizontalAlignment="Left" Height="20" Margin="60,10,0,0" TextWrapping="NoWrap" Text="" VerticalAlignment="Top" Width="100" />
<TextBox Name="tb2" HorizontalAlignment="Left" Height="20" Margin="60,60,0,0" TextWrapping="NoWrap" Text="" VerticalAlignment="Top" Width="100"/>
<TextBox Name="tb3" HorizontalAlignment="Left" Height="20" Margin="60,110,0,0" TextWrapping="NoWrap" Text="" VerticalAlignment="Top" Width="100"/>
<Button Content="Get" HorizontalAlignment="Left" Margin="10,190,0,0" VerticalAlignment="Top" Width="75" Click="Get_Click" />
<Button Content="Add" HorizontalAlignment="Left" Margin="10,230,0,0" VerticalAlignment="Top" Width="75" Click="Add_Click" />
<Button Content="Delete" HorizontalAlignment="Left" Margin="10,270,0,0" VerticalAlignment="Top" Width="75" Click="Delete_Click" />
</Grid>
This is my .CS code
public partial class MainWindow : Window
{
ObservableCollection<User> Users = new ObservableCollection<User>();
public MainWindow()
{
InitializeComponent();
Users.Add(new User() { Id = 101, Name = "leon", Salary = 10 });
Users.Add(new User() { Id = 102, Name = "allen", Salary = 20 });
Users.Add(new User() { Id = 103, Name = "neon", Salary = 30 });
Users.Add(new User() { Id = 104, Name = "xeln", Salary = 40 });
Users.Add(new User() { Id = 105, Name = "kalen", Salary = 50 });
Users.Add(new User() { Id = 106, Name = "velen", Salary = 60 });
dgsample.ItemsSource = Users;
}
private void Iddetails(object sender, SelectionChangedEventArgs args)
{
int index = dgsample.SelectedIndex;
tb1.Text = Users[index].Id.ToString();
tb2.Text = Users[index].Name;
tb3.Text = Users[index].Salary.ToString();
}
private void Get_Click(object sender, RoutedEventArgs e)
{
int index;
if (int.TryParse(this.tb1.Text, out index))
{
User currentUser = Users.FirstOrDefault(Select => Select.Id == int.Parse(tb1.Text));
if (currentUser != null)
{
this.tb2.Text = currentUser.Name;
this.tb3.Text = currentUser.Salary.ToString();
}
else
MessageBox.Show("User with the provided ID does not Exist", "Error");
}
else
MessageBox.Show("ID entered is not valid number", "Error");
}
private void Add_Click(object sender, RoutedEventArgs e)
{
if (!tb1.Text.Equals(""))
{
var adduser = Users.Where(User => User.Id == int.Parse(tb1.Text));
if (!adduser.Any())
{
Users.Add(new User() { Id = int.Parse(tb1.Text), Name = tb2.Text, Salary = int.Parse(tb3.Text) });
}
else
MessageBox.Show("Someone already has that ID.");
}
}
private void Delete_Click(object sender, RoutedEventArgs e)
{
int index;
if (int.TryParse(this.tb1.Text, out index))
{
User currentUser = Users.FirstOrDefault(Select => Select.Id == int.Parse(tb1.Text));
if (currentUser != null)
{
Users.Remove(currentUser);
}
else
MessageBox.Show("User with the provided ID does not Exist", "Error");
}
else
MessageBox.Show("ID entered is not valid number", "Error");
}
}
This code is working but i need the same thing using the concept of DataBinding and Validations for TextBoxes,Please help me with the required code
Upvotes: 1
Views: 958
Reputation: 3069
Well you would have some work rewriting it using DataBinding that is the general overview on creating data bindings for example:
<TextBox Name="tb3" HorizontalAlignmentText="{Binding Path=SelectedIndex, ElementName=Grid, , Mode=OneWay}"/>
So let me explain, I have binded Text
property of TextBox tb3
to the following property SelctedIndex
of element Grid
using following mode OneWay
which means, changing the selected index in the Grid will affect tb3 Text
but changing the Text
in the textbox will not affect actual Grid
selection. Sometimes when the property types doesn't match you have to use a converter here is an example:
In general it looks pretty much like this, but note that you could also bind the propierties in code-behind but if you can better stay to xaml.
Tip: If you want to use bindings you have to make sure that the Path
points at property.
Finally here are the links for more information about validation you should check out:
NEW: www.codeproject.com
Or code-behind (not recommended)
private void tb1_TextChanged(object sender, TextChangedEventArgs e)
{
int output;
if (!int.TryParse(tb1.Text, out output))
{
MessageBox.Show("Enter valid int.");
tb1.Text = "0";
}
}
Useful link about DataBinding:
Here I provide you with binding and converter for tb2
TextBox, to display currently selected user name
:
Add this class to your namespace:
using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfApplicationTest
{
[ValueConversion(typeof(object), typeof(String))]
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string name = "";
if (value != null)
{
User user = (User)value;
name = user.Name;
}
else
{
name = "";
}
return name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}
Then add this to you window:
xmlns:myNamespace="clr-namespace:WpfApplicationTest"
<Window.Resources>
<myNamespace:MyConverter x:Key="myConverter"/>
</Window.Resources>
Then edit your TextBox like this:
<TextBox Name="tb2" Text="{Binding Path=SelectedItem, ElementName=Grid, Mode=OneWay, Converter={StaticResource myConverter}}"/>
Upvotes: 1
Reputation: 940
this may help you
<Binding Path="EventDate" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
you can refer to this link also http://www.codeproject.com/Articles/29054/WPF-Data-Binding-Part-1
Upvotes: 2
Reputation: 8791
What you need to do first ist read about MVVM.
You seem to be using wpf as winforms which sucks big time.
When you done reading about mvvm (let say in a week.. or so), read those articles.
IDataErrorInfo is what you looking for:
http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/
http://tarundotnet.wordpress.com/2011/03/03/wpf-tutorial-how-to-use-idataerrorinfo-in-wpf/
Upvotes: 1