如何从 ViewModel 中删除方法的执行 - Xamarin.Forms - MVVM
How to remove the execution of a method from a ViewModel - Xamarin.Forms - MVVM
我有一个 <List>
,它通过从 <Button>
调用模态来添加和删除元素,如图所示。
提升模式时,我向用户显示可以与主列表相关联的元素,并且还用 <Switch>
指示是否添加这些元素,用 objective 表示按下开关时从主列表中添加或删除元素
问题是,当模态提升时,执行了向列表中添加和删除元素的方法,每次提升模态时,我的记录都是重复的,如图
这是因为在提升模态时,会执行添加或删除化学品的方法,每次调用绑定到<Switch>
的属性值时都会调用此方法视图发生变化
为什么会这样?我怎样才能避免它?
然后我展示我的代码...
MODAL.XAML:
<StackLayout
BindingContext="{Binding AgregarSustancia}">
<ListView
ItemsSource="{Binding ListaSustancias}"
SelectedItem="{Binding SelectedSustancia}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<StackLayout Orientation="Vertical">
<Label Text="{Binding NombreSustancia}"
HorizontalOptions="FillAndExpand"
VerticalOptions="CenterAndExpand"/>
</StackLayout>
<Switch
OnColor="{StaticResource das.color.verde}" HorizontalOptions="EndAndExpand"
VerticalOptions="Start"
IsToggled="{Binding SustanciaAsociada, Mode=OneWay}">
</Switch>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackLayout/>
AGREGARSUSTANCIA.CS:
bool sustanciaAsociada;
[JsonProperty(PropertyName = "chemicalIsAssociateWithInstallation")]
public bool SustanciaAsociada
{
get
{
return sustanciaAsociada;
}
set
{
if (value != sustanciaAsociada)
{
sustanciaAsociada = value;
AsociarDesasociar(sustanciaAsociada);
}
}
}
//METHOD THAT ADDS OR ELIMINATES DEPENDING ON THE VALUE OF THE PARAMETER
private async void AsociarDesasociar(bool sustanciaAsociada)
{
//ADD TO LIST
if (sustanciaAsociada)
{
}
else //REMOVE TO LIST
{
}
}
然后是填充模态列表的我的 ViewModel
VIEWMODEL.CS: (模态)
#region Constructor
public AgregarSustanciaViewModel(ObservableCollection<AgregarSustancia> listaAgregarSustancia)
{
navigationService = new NavigationService();
ListaSustancias = new ObservableCollection<AgregarSustancia>();
listaSustanciasAux = new List<AgregarSustancia>(listaAgregarSustancia);
ListaSustancias = listaAgregarSustancia;
}
#endregion
如何防止 Switch 的 Get-Set 属性 中的方法 AsociarDesasociar()
执行模态?我怎样才能封装这个方法?
对我有帮助吗?
创建一个 bool InitComplete
并将其初始化为 false
。这将防止 AsociarDesasociar
在初始化完成之前执行
if (value != sustanciaAsociada)
{
sustanciaAsociada = value;
if (InitComplete) {
AsociarDesasociar(sustanciaAsociada);
}
}
在您的 class 完成所需的任何初始化之后,然后设置 InitComplete = true
我有一个 <List>
,它通过从 <Button>
调用模态来添加和删除元素,如图所示。
提升模式时,我向用户显示可以与主列表相关联的元素,并且还用 <Switch>
指示是否添加这些元素,用 objective 表示按下开关时从主列表中添加或删除元素
问题是,当模态提升时,执行了向列表中添加和删除元素的方法,每次提升模态时,我的记录都是重复的,如图
这是因为在提升模态时,会执行添加或删除化学品的方法,每次调用绑定到<Switch>
的属性值时都会调用此方法视图发生变化
为什么会这样?我怎样才能避免它?
然后我展示我的代码...
MODAL.XAML:
<StackLayout
BindingContext="{Binding AgregarSustancia}">
<ListView
ItemsSource="{Binding ListaSustancias}"
SelectedItem="{Binding SelectedSustancia}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<StackLayout Orientation="Vertical">
<Label Text="{Binding NombreSustancia}"
HorizontalOptions="FillAndExpand"
VerticalOptions="CenterAndExpand"/>
</StackLayout>
<Switch
OnColor="{StaticResource das.color.verde}" HorizontalOptions="EndAndExpand"
VerticalOptions="Start"
IsToggled="{Binding SustanciaAsociada, Mode=OneWay}">
</Switch>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackLayout/>
AGREGARSUSTANCIA.CS:
bool sustanciaAsociada;
[JsonProperty(PropertyName = "chemicalIsAssociateWithInstallation")]
public bool SustanciaAsociada
{
get
{
return sustanciaAsociada;
}
set
{
if (value != sustanciaAsociada)
{
sustanciaAsociada = value;
AsociarDesasociar(sustanciaAsociada);
}
}
}
//METHOD THAT ADDS OR ELIMINATES DEPENDING ON THE VALUE OF THE PARAMETER
private async void AsociarDesasociar(bool sustanciaAsociada)
{
//ADD TO LIST
if (sustanciaAsociada)
{
}
else //REMOVE TO LIST
{
}
}
然后是填充模态列表的我的 ViewModel
VIEWMODEL.CS: (模态)
#region Constructor
public AgregarSustanciaViewModel(ObservableCollection<AgregarSustancia> listaAgregarSustancia)
{
navigationService = new NavigationService();
ListaSustancias = new ObservableCollection<AgregarSustancia>();
listaSustanciasAux = new List<AgregarSustancia>(listaAgregarSustancia);
ListaSustancias = listaAgregarSustancia;
}
#endregion
如何防止 Switch 的 Get-Set 属性 中的方法 AsociarDesasociar()
执行模态?我怎样才能封装这个方法?
对我有帮助吗?
创建一个 bool InitComplete
并将其初始化为 false
。这将防止 AsociarDesasociar
在初始化完成之前执行
if (value != sustanciaAsociada)
{
sustanciaAsociada = value;
if (InitComplete) {
AsociarDesasociar(sustanciaAsociada);
}
}
在您的 class 完成所需的任何初始化之后,然后设置 InitComplete = true