Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XAML and WPF - Passing Variables to XAML Windows

Tags:

c#

wpf

xaml

I'm pretty new to WPF and i'm trying to load a XAML window and pass a variable to this XAML in its constructor or so, because i need it to load some items from this passed variable.

Could anyone point me to the direction of how to go about this please? How does one start up a XAML window and give it a variable please?

Thanks in advance.. Erika

like image 595
Erika Avatar asked Mar 31 '10 04:03

Erika


2 Answers

Try to use MVVM (Model-View-ViewModel) pattern.

You need Model:

class Person
{
    public string Name { get; set; }
}

View is your window or UserControl.

ViewModel can be something like that:

class PersonViewModel : INotifyPropertyChanged
{
 private Person Model;
 public PersonViewModel(Person model)
 {
  this.Model = model;
 }

 public string Name
 {
  get { return Model.Name; }
  set
  {
   Model.Name = value;
   OnPropertyChanged("Name");
  }
 }

 public event PropertyChangedEventHandler PropertyChanged;
 private void OnPropertyChanged(string propertyName)
 {
  var e = new PropertyChangedEventArgs(propertyName);
  PropertyChangedEventHandler changed = PropertyChanged;
  if (changed != null) changed(this, e);
 }
}

Then you need to specify DataContext for your window:

View.DataContext = new PersonViewModel(somePerson);

And then define bindings in XAML:

<UserControl x:Class="SomeApp.View"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
<Grid>
    <TextBlock Text="{Binding Name}" />
<Grid>    
<UserControl>

MVVM makes code very elegant and easy.

You can also try PRISM or Caliburn (http://caliburn.codeplex.com/) frameworks but they are more complex.

like image 107
darja Avatar answered Sep 21 '22 06:09

darja


Typically, in WPF, you'd create the items you want to load, and set the Window (or UserControl)'s DataContext to the class that contains your items. You can then bind directly to these in order to do custom display from the XAML.

like image 27
Reed Copsey Avatar answered Sep 19 '22 06:09

Reed Copsey