问题描述
所以我要的是更新urlMain.forEach(data => {
test("Lens",async t => {
await t.navigateTo(data.new);
await t.takeScreenshot()
})
})
并将其物理保存到模型中,以便只要应用程序运行,它将保留用户输入的内容。
我有2个视图SelectedModel.TechName
在两个视图中均被调用。它从模型中提取数据,但是当我更改视图时,数据将重置。
有什么建议吗?
edit:我试图使输入的数据持久化,我认为设置值可以做到这一点,但是每次我在视图之间切换时,它都会重置数据。实际上,它会闪烁数据然后将其重置。
DefaultView.Xaml中的字段
SelectedModel.TechName
DataModel.cs模型文件
<StackPanel Grid.Row="0" Grid.Column="6" Grid.ColumnSpan="1" Margin="5 5 5 0">
<TextBox Name="techName" Text="{Binding SelectedModel.TechName,Mode=TwoWay}" BorderBrush="#FF4A5780" Grid.RowSpan="2"/>
</StackPanel>
<TextBlock x:Name="TextUpdate" Grid.Column="5" HorizontalAlignment="Left" Margin="41,0"
Grid.Row="1" Text="{Binding SelectedModel.TechName}" TextWrapping="Wrap" VerticalAlignment="Center"/>
DefaultViewModel.cs
namespace callFlow.Models
{
public class DataModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string techName;
public DataModel()
{
}
public string TechName
{
get { return techName; }
set { techName = value;
OnPropertyChanged();
}
}
private void OnPropertyChanged([CallerMemberName] string techName = null)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(techName));
}
}
}
解决方法
绑定后,您拥有
UpdateSourceTrigger=Explicit
在
Text="{Binding SelectedModel.TechName,Mode=TwoWay,UpdateSourceTrigger=Explicit}"
执行此操作时,必须编写代码以更新source属性。这是viewmodel属性。 由于您不这样做,因此在其中键入文本时,视图模型将不会更新。
您应该从绑定中删除它,或者编写更多代码。
,您的代码中存在多个潜在问题。首先,您将Explicit
用作UpdateSourceTrigger
,但从不调用UpdateSource
,至少您没有在代码中显示。因此,该属性将永远不会更新。改用PropertyChanged
或LostFocus
。
如果将UpdateSourceTrigger值设置为Explicit,则必须调用UpdateSource方法,否则更改将不会传播回源。
此外,您在视图模型中实现了INotifyPropertyChanged
,但从未调用过OnPropertyChanged
。因此,当属性更改其值时,绑定将永远不会更新。您的属性应如下所示。这适用于您公开的所有属性。
public string TechName
{
get { return techName; }
set
{
if (techName != value)
{
techName = value;
OnPropertyChanged();
}
}
}
尚不清楚如何创建视图并设置其DataContext
。如果您在视图的XAML中创建数据上下文视图模型,则每次实例化新视图时都会创建该模型。
简单解决方案
从DefaultView.xaml中删除UpdateSourceTriger=Explicit
<TextBox Name="techName" Text="{Binding SelectedModel.TechName,Mode=TwoWay}" BorderBrush="#FF4A5780" Grid.RowSpan="2"/>
调用OnPropertyChanged
中的DataModel
方法。TechName
的设置方法。像这样:
public string TechName
{
get {
return techName;
}
set {
techName = value;
OnPropertyChanged();
}
}
更好的解决方案
您的代码有一些问题。解决方法如下:
DefaultView.xaml
删除UpdateSourceTrigger=Explicit
。它要求您手动(从代码中)更新绑定,而您没有这样做。
<StackPanel Grid.Row="0" Grid.Column="6" Grid.ColumnSpan="1" Margin="5 5 5 0">
<TextBox Name="techName" Text="{Binding SelectedModel.TechName,Mode=TwoWay}" BorderBrush="#FF4A5780" Grid.RowSpan="2"/>
<TextBlock x:Name="TextUpdate" Grid.Column="5" HorizontalAlignment="Left" Margin="41,0"
Grid.Row="1" Text="{Binding SelectedModel.TechName}" TextWrapping="Wrap" VerticalAlignment="Center"/>
DataModel.cs
您没有在OnPropertyChanged
的设置方法中调用TechName
方法,这就是为什么它没有更新。我已经完成了,并对代码进行了重构
public class DataModel : ObservableObject
{
private string _techName;
public string TechName
{
get => _techName;
set {
_techName = value;
OnPropertyChanged();
}
}
}
DefaultViewModel.cs
在这里,我刚刚删除了空的默认构造函数,额外的私有DataModel
字段并重构了代码。
public class DefaultViewModel : ObservableObject
{
private ObservableCollection<DataModel> Models = new ObservableCollection<DataModel>();
private DataModel _selectedModel;
public DataModel SelectedModel
{
get => _selectedModel ?? (_selectedModel = new SelectedModel());
set {
_selectedModel = value;
OnPropertyChanged();
}
}
}
INotifyPropertyChanged实现-ObservableObject.cs
由于您在DataModel.cs和DefaultViewModel.cs中使用了相同的代码,因此我添加了此类以简化其余代码。
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
}