为什么动态更改的数据没有在此处的MVVM绑定上更新

本文关键字:MVVM 绑定 更新 动态 数据 为什么 | 更新日期: 2023-09-27 18:20:34

我在silverlight中使用Mvvm方法。在那里我尝试绑定一个像这样的TextBox:

<Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding ViewModelText}" Grid.Row="0"></TextBlock>       
</Grid>

其中此xaml后面的xaml.cs类是:

 public partial class UIeLementRender : UserControl
    {
        public UIeLementRender()
        {
            InitializeComponent();
            this.DataContext = new ViewModel.TabControlStuffViewModel.uiElementRendererViewModel();
        }
    }

视图模型类为:

public class uiElementRendererViewModel: GenericViewModel 
{
    private String viewModelText;
    public String ViewModelText 
    {
        get 
        {
            return viewModelText;
        }
        set 
        {
            viewModelText = value;
            OnPropertyChanged("ViewModelText");
        }
    }
    public uiElementRendererViewModel() 
    {
        this.viewModelText = "Hii from UIelemnt  rendering"; //this updated but below one is never updated.
    }
    public uiElementRendererViewModel(ProgramVersion pv) //This constructor is called dynamically on abutton click from other view model class but it never updates the viewModelText
    {      
        this.viewModelText = "Hii changed  UIelemnt  rendering";
        this.OnPropertyChanged("ViewModelText");
    }
}

现在,当我运行代码时,它会显示"Hii from UIelemnt rendering";(这是正确的),但当我动态按下另一个viewmodel类中的按钮时,我希望将viewModelText上的新文本更新为"Hii changed UIelemnt rendering"。即使我在第二个成本生成器中完成了"this.OnPropertyChanged("ViewModelText");",它也没有更新。(它仍然有默认构造函数的文本/没有参数)

如何更新这个动态获取的next文本?

为什么动态更改的数据没有在此处的MVVM绑定上更新

您需要设置实际属性,而不是重新初始化整个ViewModel:

viewModel.ViewModelText = "Hii changed  UIelemnt  rendering";

构造函数中对OnPropertyChanged的调用是多余的,因为它将在任何实际绑定发生之前运行。

如果必须重新初始化ViewModel,并且无法解决此问题,则还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例。

我创建了一些示例文件来说明如何做到这一点:http://pastebin.com/W6Yh7N6E

我将在这里用一个简短的列表来说明WPF将如何进行数据绑定:

  1. 创建视图
  2. 创建ViewModel(实例化、运行构造函数等)-在您自己的示例中,这是当前触发事件的位置
  3. 将ViewModel设置为DataContext(在您的示例中,无论如何都不会发生这种情况)
  4. WPF使用当前值更新其绑定(因此这里不需要另一个PropertyChanged事件)

还有很多事情在幕后发生,但这些步骤应该足以让您充分理解为什么PropertyChanged事件在构造函数中不起任何作用。

当您通过单击按钮创建新的视图模型时,实际上您有两个视图模型实例。然而,UI仍然绑定到第一个,所以无论您在第二个中做什么更改,都不会出现在UI上。您可以将第二个实例设置为新的DataContext:

private void OnButtonClick(object sender, EventArgs e)
{
    this.DataContext = new ViewModel.TabControlStuffViewModel.uiElementRendererViewModel(/*pass variable here*/);
}

但这并不是你真正想要的。相反,您应该修改现有的视图模型对象:

private void OnButtonClick(object sender, EventArgs e)
{
   var vm = this.DataContext as uiElementRendererViewModel; // Get the current view model and cast it to correct type
   vm.ViewModelText = "Enter new text here"; // Update the text
}