Today, I introduce how to bind from properties in a class to UI properties by using INotifyPropertyChanged and ObservableCollection. And I'll show you the problem I encountered in next blog post.
- Sample code of property binding
I introduce a sample code binding from properties in ItemProperties class to TextBlock's properties in ListBox (One Way).
- The xaml code is here.
<ListBox Height="595" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="12,6,0,0" Name="listBox1" VerticalAlignment="Top" Width="438">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">
<TextBlock x:Name="Name1" FontSize="35" Text="{Binding Text1}" Foreground="{Binding Color1}"/>
<TextBlock x:Name="Name2" FontSize="35" Text="{Binding Text2}" Foreground="{Binding Color2}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
- Point -
You need to add ItemsSource="{Binding}" in ListBx to bind properties from code behind. You also should not add like ItemsSource="{Binding Collection}", just write "{Binding}".
When you use DataTemplate in ListBox, you can't write like this in code behind.
When you use DataTemplate in ListBox, you can't write like this in code behind.
Name1.Foreground = new SolidColorBrush(Colors.LightGray);
So you need to bind from properties as a class to UI properties. Almost all of UI element properties (ex. Foreground, Text, any more) are implemented as dependency property. You can bind from properties as a class to UI properties using dependency property. You can't bind using usual property.
- The code behind is here.
public partial class MainPage : PhoneApplicationPage
{
public ObservableCollection<ItemProperties> ItemCollection { get; private set; }
// Constructor
public MainPage()
{
InitializeComponent();
GetList();
}
public void GetList()
{
ItemCollection = new ObservableCollection<ItemProperties>();
ItemCollection.Add(new ItemProperties
{
Text1 = "test01",
Text2 = "test01",
Color1 = new SolidColorBrush(Colors.LightGray),
Color2 = new SolidColorBrush(Colors.Brown)
});
ItemCollection.Add(new ItemProperties
{
Text1 = "test02",
Text2 = "test02",
Color1 = new SolidColorBrush(Colors.Cyan),
Color2 = new SolidColorBrush(Colors.Red)
});
ItemCollection.Add(new ItemProperties
{
Text1 = "test03",
Text2 = "test03",
Color1 = new SolidColorBrush(Colors.Orange),
Color2 = new SolidColorBrush(Colors.Purple)
});
DataContext = ItemCollection;
}
}
public class ItemProperties : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ItemProperties() { }
private string m_Text1;
public string Text1
{
get { return m_Text1; }
set
{
m_Text1 = value;
OnPropertyChanged("Text1");
}
}
private string m_Text2;
public string Text2
{
get { return m_Text2; }
set
{
m_Text2 = value;
OnPropertyChanged("Text2");
}
}
private Brush m_Color1;
public Brush Color1
{
get { return m_Color1; }
set
{
m_Color1 = value;
OnPropertyChanged("Color1");
}
}
private Brush m_Color2;
public Brush Color2
{
get { return m_Color2; }
set
{
m_Color2 = value;
OnPropertyChanged("Color2");
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
}
- Result


Thanks for sharing the article.This article gives a way out from a problem which i was facing from a long time.
ReplyDeleteHiii, when I add more items to the view model, the listbox doesnot show those new items. I must scroll up, then down to see them.i have used INotifyPropertyChanged and also raised PropertyChanged but still i am getting this problem. how to fix?
ReplyDelete