WPF : MVVM Microsoft.Expression.Interaction

162 views Asked by At

I am working on MVVM , I have used interactions. XAML Binding

Purpose is what ever will be typed in text box, same will be displayed in TextBlock.

Interaction trigger will be done event PreviewTextInput of text box.

But it is giving error but not working as expected.

Binding error at runtime image has been attached.

Below is the code.

XAML

<Window x:Class="MVVMApp.TextBindings"
    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:local="clr-namespace:MVVMApp"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    mc:Ignorable="d"
    
    Title="Text Bindings" Height="450" Width="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Enter Text Value" Grid.Row="0" Grid.Column="0"/>
    <TextBox Name="txtBox1" Text="{Binding BxVal,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1" Width="150" Height="30">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="PreviewTextInput">
                <i:InvokeCommandAction Command="{Binding cmdType}" CommandParameter="{Binding BxVal,ElementName=txtBox1}"></i:InvokeCommandAction>
            </i:EventTrigger>
            </i:Interaction.Triggers>
    </TextBox>
    <TextBlock Text="Result --> " Grid.Row="1" Grid.Column="0"/>
    <TextBlock  Text="{Binding Result,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Lavender" Grid.Row="1" Grid.Column="1"/>
</Grid>

MVVM

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MVVMApp.Helper;
namespace MVVMApp.ViewModel
{
class TextBindingsVM :ViewModelBase
 {
    
    DelegateCommand <object> cmdType { get; set; }
    
    private string _Result { get; set; }
    public string Result
    {
        get { return _Result; }
        set
        {
              _Result = value;
               OnPropertyChanged(this, "Result");
        }
    }
    private string _BxVal { get; set; }

    public string BxVal
    {
        get { return _BxVal; }
        set
        {
            _BxVal = value;
            OnPropertyChanged(this, "BxVal");
            Result = BxVal;
        }
    }

    public TextBindingsVM()
    {
        cmdType = new DelegateCommand<object>(cmdType_Execute);
    }

    private void cmdType_Execute(object obj)
    {
        throw new NotImplementedException();
    }
}

}

1

There are 1 answers

0
Ajay Mishra On

I found the issue. Actually INotifyPropertyChanged was not implemented in ViewModelBase class

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVVMApp.Helper
{
    class ViewModelBase:INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(object sender, string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
    }
}