UWP XAML Prism Not DataBinding Correctly
up vote
0
down vote
favorite
I am learning UWP with prism but I can not get it to work. I created a project with the Prism Mvvm template and I have only added a model and a few controls.
on running the app there is nothing in top textbox bound to MyPerson.Name the second textbox bound to Myperson.Age shows 25. When I click on the button the top text box show "Joe Blogs" and the second textbox remians the same. Nothing is being updated?
Here is the XAML code:
<Page
x:Class="App5.Views.MainPage"
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:prismMvvm="using:Prism.Windows.Mvvm"
prismMvvm:ViewModelLocator.AutoWireViewModel="True"
Style="{StaticResource PageStyle}"
mc:Ignorable="d">
<Grid x:Name="ContentArea" Margin="{StaticResource MediumLeftRightMargin}">
<Grid.RowDefinitions>
<RowDefinition Height="48" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="Main_Title"
Grid.Row="0"
Style="{StaticResource PageTitleStyle}" />
<Grid Grid.Row="1" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
<StackPanel>
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Name, Mode=TwoWay}" />
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Age, Mode=TwoWay}" />
<Button
Width="100"
Height="100"
HorizontalAlignment="Center"
Click="Button_Click"
Content="test" />
</StackPanel>
</Grid>
</Grid>
My model:
namespace App5.Models
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
}
My ViewModel:
using App5.Models;
using Prism.Windows.Mvvm;
namespace App5.ViewModels
{
public class MainViewModel : ViewModelBase
{
private Person _myPerson;
public Person MyPerson
{
get => _myPerson;
set => SetProperty(ref _myPerson, value);
}
public MainViewModel()
{
MyPerson = new Person() { Age = 25, Name = "Bill Blogs" };
}
}
}
My code behind:
using System;
using App5.ViewModels;
using Windows.UI.Xaml.Controls;
namespace App5.Views
{
public sealed partial class MainPage : Page
{
private MainViewModel ViewModel => DataContext as MainViewModel;
public MainPage()
{
InitializeComponent();
}
private void MainPage_Loaded(object sender,
Windows.UI.Xaml.RoutedEventArgs e)
{
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
ViewModel.MyPerson = ViewModel.MyPerson;
}
}
}
uwp prism
add a comment |
up vote
0
down vote
favorite
I am learning UWP with prism but I can not get it to work. I created a project with the Prism Mvvm template and I have only added a model and a few controls.
on running the app there is nothing in top textbox bound to MyPerson.Name the second textbox bound to Myperson.Age shows 25. When I click on the button the top text box show "Joe Blogs" and the second textbox remians the same. Nothing is being updated?
Here is the XAML code:
<Page
x:Class="App5.Views.MainPage"
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:prismMvvm="using:Prism.Windows.Mvvm"
prismMvvm:ViewModelLocator.AutoWireViewModel="True"
Style="{StaticResource PageStyle}"
mc:Ignorable="d">
<Grid x:Name="ContentArea" Margin="{StaticResource MediumLeftRightMargin}">
<Grid.RowDefinitions>
<RowDefinition Height="48" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="Main_Title"
Grid.Row="0"
Style="{StaticResource PageTitleStyle}" />
<Grid Grid.Row="1" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
<StackPanel>
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Name, Mode=TwoWay}" />
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Age, Mode=TwoWay}" />
<Button
Width="100"
Height="100"
HorizontalAlignment="Center"
Click="Button_Click"
Content="test" />
</StackPanel>
</Grid>
</Grid>
My model:
namespace App5.Models
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
}
My ViewModel:
using App5.Models;
using Prism.Windows.Mvvm;
namespace App5.ViewModels
{
public class MainViewModel : ViewModelBase
{
private Person _myPerson;
public Person MyPerson
{
get => _myPerson;
set => SetProperty(ref _myPerson, value);
}
public MainViewModel()
{
MyPerson = new Person() { Age = 25, Name = "Bill Blogs" };
}
}
}
My code behind:
using System;
using App5.ViewModels;
using Windows.UI.Xaml.Controls;
namespace App5.Views
{
public sealed partial class MainPage : Page
{
private MainViewModel ViewModel => DataContext as MainViewModel;
public MainPage()
{
InitializeComponent();
}
private void MainPage_Loaded(object sender,
Windows.UI.Xaml.RoutedEventArgs e)
{
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
ViewModel.MyPerson = ViewModel.MyPerson;
}
}
}
uwp prism
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am learning UWP with prism but I can not get it to work. I created a project with the Prism Mvvm template and I have only added a model and a few controls.
on running the app there is nothing in top textbox bound to MyPerson.Name the second textbox bound to Myperson.Age shows 25. When I click on the button the top text box show "Joe Blogs" and the second textbox remians the same. Nothing is being updated?
Here is the XAML code:
<Page
x:Class="App5.Views.MainPage"
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:prismMvvm="using:Prism.Windows.Mvvm"
prismMvvm:ViewModelLocator.AutoWireViewModel="True"
Style="{StaticResource PageStyle}"
mc:Ignorable="d">
<Grid x:Name="ContentArea" Margin="{StaticResource MediumLeftRightMargin}">
<Grid.RowDefinitions>
<RowDefinition Height="48" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="Main_Title"
Grid.Row="0"
Style="{StaticResource PageTitleStyle}" />
<Grid Grid.Row="1" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
<StackPanel>
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Name, Mode=TwoWay}" />
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Age, Mode=TwoWay}" />
<Button
Width="100"
Height="100"
HorizontalAlignment="Center"
Click="Button_Click"
Content="test" />
</StackPanel>
</Grid>
</Grid>
My model:
namespace App5.Models
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
}
My ViewModel:
using App5.Models;
using Prism.Windows.Mvvm;
namespace App5.ViewModels
{
public class MainViewModel : ViewModelBase
{
private Person _myPerson;
public Person MyPerson
{
get => _myPerson;
set => SetProperty(ref _myPerson, value);
}
public MainViewModel()
{
MyPerson = new Person() { Age = 25, Name = "Bill Blogs" };
}
}
}
My code behind:
using System;
using App5.ViewModels;
using Windows.UI.Xaml.Controls;
namespace App5.Views
{
public sealed partial class MainPage : Page
{
private MainViewModel ViewModel => DataContext as MainViewModel;
public MainPage()
{
InitializeComponent();
}
private void MainPage_Loaded(object sender,
Windows.UI.Xaml.RoutedEventArgs e)
{
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
ViewModel.MyPerson = ViewModel.MyPerson;
}
}
}
uwp prism
I am learning UWP with prism but I can not get it to work. I created a project with the Prism Mvvm template and I have only added a model and a few controls.
on running the app there is nothing in top textbox bound to MyPerson.Name the second textbox bound to Myperson.Age shows 25. When I click on the button the top text box show "Joe Blogs" and the second textbox remians the same. Nothing is being updated?
Here is the XAML code:
<Page
x:Class="App5.Views.MainPage"
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:prismMvvm="using:Prism.Windows.Mvvm"
prismMvvm:ViewModelLocator.AutoWireViewModel="True"
Style="{StaticResource PageStyle}"
mc:Ignorable="d">
<Grid x:Name="ContentArea" Margin="{StaticResource MediumLeftRightMargin}">
<Grid.RowDefinitions>
<RowDefinition Height="48" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="Main_Title"
Grid.Row="0"
Style="{StaticResource PageTitleStyle}" />
<Grid Grid.Row="1" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
<StackPanel>
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Name, Mode=TwoWay}" />
<TextBox
Width="100"
Height="100"
Text="{x:Bind Path=ViewModel.MyPerson.Age, Mode=TwoWay}" />
<Button
Width="100"
Height="100"
HorizontalAlignment="Center"
Click="Button_Click"
Content="test" />
</StackPanel>
</Grid>
</Grid>
My model:
namespace App5.Models
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
}
My ViewModel:
using App5.Models;
using Prism.Windows.Mvvm;
namespace App5.ViewModels
{
public class MainViewModel : ViewModelBase
{
private Person _myPerson;
public Person MyPerson
{
get => _myPerson;
set => SetProperty(ref _myPerson, value);
}
public MainViewModel()
{
MyPerson = new Person() { Age = 25, Name = "Bill Blogs" };
}
}
}
My code behind:
using System;
using App5.ViewModels;
using Windows.UI.Xaml.Controls;
namespace App5.Views
{
public sealed partial class MainPage : Page
{
private MainViewModel ViewModel => DataContext as MainViewModel;
public MainPage()
{
InitializeComponent();
}
private void MainPage_Loaded(object sender,
Windows.UI.Xaml.RoutedEventArgs e)
{
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
ViewModel.MyPerson = ViewModel.MyPerson;
}
}
}
uwp prism
uwp prism
asked Nov 5 at 7:07
Paul Stanley
551520
551520
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41
add a comment |
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41
add a comment |
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
The Person class should implement INotifyPropertyChanged interface and raise change notifications:
public class Person : ViewModelBase
{
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
private int _name;
public int Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
You could then simply set the Age and Name properties of it:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
}
For the MainViewModel to raise a change notification when you set the MyPerson property, you need to set the property to a new Person object:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson = new MyPerson() { Name = "Viv Blogs", Age = 50 };
}
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?ViewModelBaseis a base class that implements theINotifyPropertyChangedinterface.
– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement theINotifyPropertyChangedinteface directly in thePersonclass.
– mm8
Nov 6 at 9:51
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
The Person class should implement INotifyPropertyChanged interface and raise change notifications:
public class Person : ViewModelBase
{
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
private int _name;
public int Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
You could then simply set the Age and Name properties of it:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
}
For the MainViewModel to raise a change notification when you set the MyPerson property, you need to set the property to a new Person object:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson = new MyPerson() { Name = "Viv Blogs", Age = 50 };
}
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?ViewModelBaseis a base class that implements theINotifyPropertyChangedinterface.
– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement theINotifyPropertyChangedinteface directly in thePersonclass.
– mm8
Nov 6 at 9:51
add a comment |
up vote
2
down vote
accepted
The Person class should implement INotifyPropertyChanged interface and raise change notifications:
public class Person : ViewModelBase
{
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
private int _name;
public int Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
You could then simply set the Age and Name properties of it:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
}
For the MainViewModel to raise a change notification when you set the MyPerson property, you need to set the property to a new Person object:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson = new MyPerson() { Name = "Viv Blogs", Age = 50 };
}
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?ViewModelBaseis a base class that implements theINotifyPropertyChangedinterface.
– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement theINotifyPropertyChangedinteface directly in thePersonclass.
– mm8
Nov 6 at 9:51
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
The Person class should implement INotifyPropertyChanged interface and raise change notifications:
public class Person : ViewModelBase
{
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
private int _name;
public int Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
You could then simply set the Age and Name properties of it:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
}
For the MainViewModel to raise a change notification when you set the MyPerson property, you need to set the property to a new Person object:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson = new MyPerson() { Name = "Viv Blogs", Age = 50 };
}
The Person class should implement INotifyPropertyChanged interface and raise change notifications:
public class Person : ViewModelBase
{
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
private int _name;
public int Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
You could then simply set the Age and Name properties of it:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson.Name = "Viv Blogs";
ViewModel.MyPerson.Age = 50;
}
For the MainViewModel to raise a change notification when you set the MyPerson property, you need to set the property to a new Person object:
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
ViewModel.MyPerson = new MyPerson() { Name = "Viv Blogs", Age = 50 };
}
answered Nov 5 at 13:08
mm8
78.8k81731
78.8k81731
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?ViewModelBaseis a base class that implements theINotifyPropertyChangedinterface.
– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement theINotifyPropertyChangedinteface directly in thePersonclass.
– mm8
Nov 6 at 9:51
add a comment |
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?ViewModelBaseis a base class that implements theINotifyPropertyChangedinterface.
– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement theINotifyPropertyChangedinteface directly in thePersonclass.
– mm8
Nov 6 at 9:51
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
Ok should I do this with my base class or inherit from my base class?
– Paul Stanley
Nov 5 at 13:37
What do you mean?
ViewModelBase is a base class that implements the INotifyPropertyChanged interface.– mm8
Nov 5 at 13:46
What do you mean?
ViewModelBase is a base class that implements the INotifyPropertyChanged interface.– mm8
Nov 5 at 13:46
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
I didn't want to inherit from ViewModelBase for all my models.
– Paul Stanley
Nov 5 at 20:05
Create your own model base class then or implement the
INotifyPropertyChanged inteface directly in the Person class.– mm8
Nov 6 at 9:51
Create your own model base class then or implement the
INotifyPropertyChanged inteface directly in the Person class.– mm8
Nov 6 at 9:51
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53149778%2fuwp-xaml-prism-not-databinding-correctly%23new-answer', 'question_page');
}
);
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
If you are directly binding to Data model objects ( in your case Person ), I would suggest that you also add the INotifyPropertychanged interface to them. This will enable data changes to automatically propagate to the UI.
– Depechie
Nov 5 at 7:18
Ok but I thought prism did this for you.
– Paul Stanley
Nov 5 at 7:33
No it does not, but you could use Fody to auto inject it... github.com/Fody/PropertyChanged
– Depechie
Nov 5 at 7:41