关闭弹出页面后无法更新标签xamarin表单

rn0zuynd  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(86)

我有datagridview在我的弹出页面,从那里选择项目,然后我想更新选定的值在该主页上。但我不能更新这个标签。我将这两个页面绑定到同一个视图模型。我控制弹出页面关闭与此:

protected override void OnDisappearing()
    {
        viewModel.CarilisteClose = true;
        
        base.OnDisappearing();
    }

字符串
这是我的财产:

public bool CarilisteClose { get => carilisteClose; set {
            carilisteClose = value; 
            OnPropertyChanged();
            Console.WriteLine(carilisteClose);
            changeCariText(carilisteClose);
        } }


之后,我可以从输出中看到属性True和选定项。但是SearchCari在pupoppage关闭后无法更新。

public string SearchCari => $"{secilenCari}";
 void changeCariText (bool mbool ) {
        Console.WriteLine("change cari work");
        if (mbool==true)
        {
            
            var adi = Preferences.Get("selectedCariAdi", "");
            var kodu = Preferences.Get("selectedCariKodu", "");
            secilenCari = $"{kodu} {adi}";
            Console.WriteLine("cari liste close " + secilenCari);
            
            OnPropertyChanged(nameof(SearchCari));
            Console.WriteLine(SearchCari);
        }

        
    }

<Label Text="{Binding SearchCari}" x:Name="secilenCariText3" TextColor="Black"  FontSize="Medium" WidthRequest="200" HeightRequest="50"  HorizontalOptions="Center" VerticalOptions="Center"/>


编辑:好吧,我意识到:我不能更新标签,而关闭弹出页面,但当我添加按钮和设置按钮命令这个changeCariText()它更新标签。

更新https://www.paste.tc/depoaktarimpageviewmodel视图模型

https://www.paste.tc/depoaktarimpagexaml Xaml https://www.paste.tc/caripopuppage第2页

**解决方案:**保存:

CariRoot:要发送的对象
selectedCari:要从此页发送的选定对象。
mselectedCari:分隔消息的键。

MessagingCenter.Send<CariRoot>(selectedCari, "mselectedCari");


要获取您保存的内容,请执行以下操作:

MessagingCenter.Subscribe<CariRoot>(this, "mselectedCari" ,async (sender) =>
            {
              
                SearchCari = $"{sender.CARIUNVAN}";
                _SelectedCariRoot = sender;
             
               
            });


您需要在视图模型中使用这些代码。

xkrw2x1b

xkrw2x1b1#

我将这两个页面绑定到同一个视图模型。
即使两个页使用相同的视图模型,当示例化两个不同的页时,也会创建同一个类的两个示例。因此,这两个页不共享相同的值,甚至不共享相同的属性。
但是您可以将数据传递给要更新特殊属性值的页面的Viewmodel示例。
有几种方法可以传递数据。
例如,您可以使用MessagingCenterEventHandler来实现这一点。
对于如何使用EventHandler,您可以检查线程here

更新:

我添加了一个按钮,然后changeCariText()函数工作正常,更新我的文本,但当我关闭pouppage这个changeCariText()不更新文本。
请重新检查您是否已经为您的viewmodel实现了接口INotifyPropertyChanged,并为您想要更新其值和UI的属性调用了OnPropertyChanged
可以参考以下代码:

public class YourViewModel:INotifyPropertyChanged
    {
     
        private string _searchCari ;
        public string SearchCari 
        {
            set { SetProperty(ref _searchCari, value); }
            get { return _searchCari; }
        }

  void changeCariText (bool mbool ) {
    Console.WriteLine("change cari work");
    if (mbool==true)
    {
        
        var adi = Preferences.Get("selectedCariAdi", "");
        var kodu = Preferences.Get("selectedCariKodu", "");
        secilenCari = $"{kodu} {adi}";
        Console.WriteLine("cari liste close " + secilenCari);
        
         // remove the following code 
        //OnPropertyChanged(nameof(SearchCari));

       //assign value for SearchCari, the UI will update automatically.
       SearchCari = yourvalue;
        Console.WriteLine(SearchCari);
    }

    
  }

       // For brevity, omit the other code

        public YourViewModel(){
           // other code

        }   

        bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

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

    public event PropertyChangedEventHandler PropertyChanged;
}

字符串

更新2

你仍然不应该弄清楚一个类的两个示例之间的区别。这两个页面创建了类DepoAktarımPageViewModel的两个示例。在页面DepoAktarımPage上添加一个Button来更改SearchCari的值,并在页面DepoAktarımPage的示例上执行此操作。关闭页面CariPopUpPage时,将更改页面CariPopUpPage示例上的SearchCari的值。这两个示例是不相关的,这意味着两个示例的数据不共享,即使它们是同一个类的示例。因此,更改页面CariPopUpPage的ViewModel上的值根本不会影响页面DepoAktarımPage的ViewModel上的数据。
对于这个问题,可以使用MessagingCenterEventHandler来实现。
想了解更多信息,你可以查看我的第一个答案。

相关问题