C# 为什么动态更改的数据不在MVVM绑定上更新

C# 为什么动态更改的数据不在MVVM绑定上更新,c#,.net,xaml,silverlight,mvvm,C#,.net,Xaml,Silverlight,Mvvm,我在silverlight中使用Mvvm方法。我尝试绑定一个文本框,如下所示: <Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="50"></RowDefinition> <RowDefinition Height="*"></RowDe

我在silverlight中使用Mvvm方法。我尝试绑定一个文本框,如下所示:

<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>
而viewmodel类是:

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”
。即使我在第二个costructor中完成了.OnPropertyChanged(“ViewModelText”);“,它也不会更新。(仍有默认构造函数/无参数的文本)


如何更新动态获取的nex文本?

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

viewModel.ViewModelText = "Hii changed  UIelemnt  rendering";
在构造函数中调用
OnPropertyChanged
是多余的,因为这将在任何实际绑定发生之前运行

如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例

我创建了几个示例文件,说明了如何实现这一点:

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

  • 创建视图
  • 创建ViewModel(实例化、运行构造函数等)-在您自己的示例中,这就是当前触发事件的地方
  • 将ViewModel设置为DataContext(在您的示例中,这永远不会发生)
  • WPF使用当前值更新其绑定(因此此处不需要另一个PropertyChanged事件)

  • 幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。

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

    viewModel.ViewModelText = "Hii changed  UIelemnt  rendering";
    
    在构造函数中调用
    OnPropertyChanged
    是多余的,因为这将在任何实际绑定发生之前运行

    如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例

    我创建了几个示例文件,说明了如何实现这一点:

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

  • 创建视图
  • 创建ViewModel(实例化、运行构造函数等)-在您自己的示例中,这就是当前触发事件的地方
  • 将ViewModel设置为DataContext(在您的示例中,这永远不会发生)
  • WPF使用当前值更新其绑定(因此此处不需要另一个PropertyChanged事件)

  • 幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。

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

    viewModel.ViewModelText = "Hii changed  UIelemnt  rendering";
    
    在构造函数中调用
    OnPropertyChanged
    是多余的,因为这将在任何实际绑定发生之前运行

    如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例

    我创建了几个示例文件,说明了如何实现这一点:

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

  • 创建视图
  • 创建ViewModel(实例化、运行构造函数等)-在您自己的示例中,这就是当前触发事件的地方
  • 将ViewModel设置为DataContext(在您的示例中,这永远不会发生)
  • WPF使用当前值更新其绑定(因此此处不需要另一个PropertyChanged事件)

  • 幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。

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

    viewModel.ViewModelText = "Hii changed  UIelemnt  rendering";
    
    在构造函数中调用
    OnPropertyChanged
    是多余的,因为这将在任何实际绑定发生之前运行

    如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例

    我创建了几个示例文件,说明了如何实现这一点:

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

  • 创建视图
  • 创建ViewModel(实例化、运行构造函数等)-在您自己的示例中,这就是当前触发事件的地方
  • 将ViewModel设置为DataContext(在您的示例中,这永远不会发生)
  • WPF使用当前值更新其绑定(因此此处不需要另一个PropertyChanged事件)

  • 幕后还有很多事情要做,但这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。

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

    private void OnButtonClick(object sender, EventArgs e)
    {
        this.DataContext = new ViewModel.TabControlStuffViewModel.uiElementRendererViewModel(/*pass variable here*/);
    }
    
    但这并不是你真正想要的。您应该改为修改现有的viewmodel对象:

    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
    }
    

    通过单击按钮创建新的viewmodel时,实际上有两个viewmodel实例。但是,UI仍然绑定到第一个UI,因此无论您在第二个UI中做什么更改,都将永远不会更改