C# 为什么动态更改的数据不在MVVM绑定上更新
我在silverlight中使用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
<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将如何进行数据绑定:
幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。您需要设置实际的属性,而不是重新初始化整个ViewModel:
viewModel.ViewModelText = "Hii changed UIelemnt rendering";
在构造函数中调用OnPropertyChanged
是多余的,因为这将在任何实际绑定发生之前运行
如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例
我创建了几个示例文件,说明了如何实现这一点:
我将在这里用一个简短的列表来说明WPF将如何进行数据绑定:
幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。您需要设置实际的属性,而不是重新初始化整个ViewModel:
viewModel.ViewModelText = "Hii changed UIelemnt rendering";
在构造函数中调用OnPropertyChanged
是多余的,因为这将在任何实际绑定发生之前运行
如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例
我创建了几个示例文件,说明了如何实现这一点:
我将在这里用一个简短的列表来说明WPF将如何进行数据绑定:
幕后还有很多事情要做,但是这些步骤应该足以让您很好地理解为什么PropertyChanged事件在构造函数中没有任何作用。您需要设置实际的属性,而不是重新初始化整个ViewModel:
viewModel.ViewModelText = "Hii changed UIelemnt rendering";
在构造函数中调用OnPropertyChanged
是多余的,因为这将在任何实际绑定发生之前运行
如果您必须重新初始化ViewModel,并且没有可能的解决方法,那么您还需要重新初始化视图,或者手动将现有视图的DataContext设置为ViewModel类的新实例
我创建了几个示例文件,说明了如何实现这一点:
我将在这里用一个简短的列表来说明WPF将如何进行数据绑定:
幕后还有很多事情要做,但这些步骤应该足以让您很好地理解为什么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中做什么更改,都将永远不会更改