Neil Neil - 3 months ago 233
C# Question

Prism 6 DelegateCommand ObservesProperty code

Hi Good day i'm just new with WPF and MVVM design pattern and i've learned a lot from the blogs and videos of sir BRIAN LAGUNAS in PRISM.. but just want to ask a noob question..whats wrong with my code it doest work for me... any help is very appreciated thanks.
here's my code :

MY VIEW MODEL

public class Person : BindableBase
{
private myPErson _MyPerson;
public myPErson MyPerson
{
get { return _MyPerson; }
set
{
SetProperty(ref _MyPerson, value);
}
}

public Person()
{
_MyPerson = new myPErson();
updateCommand = new DelegateCommand(Execute, CanExecute).ObservesProperty(() => MyPerson.FirstName).ObservesProperty(() => MyPerson.Lastname);

// updateCommand = new DelegateCommand(Execute).ObservesCanExecute((p) => CanExecute); /// JUST WANNA TRY THIS BUT DUNNO HOW
}

private bool CanExecute()
{
return !String.IsNullOrWhiteSpace(MyPerson.FirstName) && !String.IsNullOrWhiteSpace(MyPerson.Lastname);
}

private void Execute()
{
MessageBox.Show("HOLA");
}

public DelegateCommand updateCommand { get; set; }
}


myModel

Declared to another Class File

public class myPErson : BindableBase
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
SetProperty(ref _firstName, value);
}
}

private string _lastname;
public string Lastname
{
get { return _lastname; }
set
{
SetProperty(ref _lastname, value);
}
}
}


View
Xaml Code

<Window x:Class="Prism6Test.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:myVM="clr-namespace:Prism6Test.ViewModel"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<myVM:Person x:Key="mainVM"/>
</Window.Resources>
<Grid DataContext="{StaticResource mainVM}">
<TextBox HorizontalAlignment="Left" Height="23" Margin="217,103,0,0" TextWrapping="Wrap" Text="{Binding MyPerson.FirstName,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="217,131,0,0" TextWrapping="Wrap" Text="{Binding MyPerson.Lastname,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
<Button Content="Button" Command="{Binding updateCommand}" HorizontalAlignment="Left" Margin="242,159,0,0" VerticalAlignment="Top" Width="75"/>

</Grid>
</Window>


I've Already read this but it doesnt work for me.. and cant understand how can i properly code it.. please help me ragarding this matter ..HOPE for any reply soon..thx

ObservesProperty method isn't observing model's properties at Prism 6

Answer

1) You can`t use complex datamodel like you want, so try it

private myPErson _MyPerson;
    public myPErson MyPerson
    {
        get { return _MyPerson; }
        set
        {
            if (_MyPerson != null)
                _MyPerson.PropertyChanged -= MyPersonOnPropertyChanged;

            SetProperty(ref _MyPerson, value);


            if (_MyPerson != null)
                _MyPerson.PropertyChanged += MyPersonOnPropertyChanged;
        }
    }

    private void MyPersonOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        updateCommand.RaiseCanExecuteChanged();
    }

2) Change your constructor

public Person()
    {
        MyPerson = new myPErson();
        updateCommand = new DelegateCommand(Execute, CanExecute);
    }
Comments