0

I have an entry control in my XAML where I set the initial value on page appear through data binding. Initially the value is appearing but when I am updating it from another view model it is not getting updated on UI.

Below is the XAML code and XAML.CS

        <ListView
        x:Name="workList"
        Grid.Row="2"
        SeparatorColor="{DynamicResource AccentColor}"
        ItemsSource="{ Binding WorkItems }"                   
        Margin="5"
        CachingStrategy="RecycleElement"
        RowHeight="440"
        SeparatorVisibility="Default"
        SelectionMode="None"
        HasUnevenRows="False">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <local:LoadItemPutawayTemplate />
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>


 <?xml version="1.0" encoding="UTF-8"?>
 <ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup- 
         compatibility/2006"
         mc:Ignorable="d"
         x:Class="Sanipex.LoadItemPutawayTemplate">

<Grid
    RowSpacing="0"
    Padding="0"
    Margin="0,10,0,0"
    >

    <Grid.RowDefinitions>
        <RowDefinition
            Height="*" />
    </Grid.RowDefinitions>


            <Entry
                x:Name="OverrideLoc"
                 Grid.Row="0"
                TextColor="Black"
                WidthRequest="110"
                Text="{Binding toLocation}"
                grial:EntryProperties.BorderCornerRadius="10"
                grial:EntryProperties.BorderStyle="RoundRect"
                grial:EntryProperties.BorderColor="Black"
                HorizontalOptions="StartAndExpand"
                VerticalOptions="Center"
                Focused="OverrideLoc_Focused"
                TextChanged="OverrideLoc_TextChanged"
                grial:EntryProperties.HorizontalPadding="5"
                FontAttributes="Bold"
                PlaceholderColor="Black"
                FontSize="20"/>


    </Grid>

public partial class ItemPutAway : ContentPage
{
    private static ItemPutAwayViewModel obj;
    public ItemPutAway()
    {
        InitializeComponent();


        obj = new ItemPutAwayViewModel();
        BindingContext = obj;
    }

    public static ItemPutAwayViewModel itemPutAwayViewModel
    {
        get
        {
            return obj;
        }
    }

    protected override async void OnAppearing()
    {
        obj.LoadData();
    }
}

Below is my first view model code

public class ItemPutAwayViewModel : INotifyPropertyChanged
{
  private IList<WorkItem> workItems;
  public event PropertyChangedEventHandler PropertyChanged;
  public string ltoLocation;

   public string toLocation
    {
        get => ltoLocation;
        set
        {
            ltoLocation = value;
            OnPropertyChanged(nameof(toLocation));
        }
    }

    public IList<WorkItem> WorkItems
    {
        get => workItems;
        set
        {
            workItems = value;
            OnPropertyChanged(nameof(WorkItems));
        }
    }

    public void LoadData()
    {
        WorkItems = App.dataManager.GetItemPutAwayWorks();
    }

    public void setLocation(string _location)
    {
        toLocation = _location;
    }

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Below is the code through which I am trying to update the toLocation binding value to different value from another XAML page as below:

public partial class AvailableLocationsPopUp : PopupPage
{
    private static AvailableLocationViewModel obj;


    public AvailableLocationsPopUp(WorkItem _workItem)
    {
        InitializeComponent();


        obj = new AvailableLocationViewModel(gWorkItem.itemid);
        BindingContext = obj;
    }

    private void OnClose(object sender, EventArgs e)
    {
        PopupNavigation.Instance.PopAsync();
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        Location content = e.Item as Location;

        ItemPutAway.itemPutAwayViewModel.setLocation("ABC-XYZ");

        PopupNavigation.Instance.PopAsync();

    }
}
4

1 回答 1

2

As I mentioned in the discussion, you have to also implement the INotifyPropertyChanged interface of the class WorkItem.

Implement INotifyPropertyChanged in ItemPutAwayViewModel will only help for changes in the WorkItems(like add or remove one WorkItem), not the changes inside the WorkItem.

So, the code should be:

public class WorkItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _toLocation; 

    public string toLocation 
    { 
    get => _toLocation; 
    set 
        { 
          _toLocation = value; 
          NotifyPropertyChanged(); 
        } 
    } 

    protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

}
于 2019-08-20T07:56:28.500 回答