在UI元素设置期间忽略属性设置调用



在UWP中,我有一个ListView,用于项目列表。可以通过更改Sizes列表中的选择来更改该列表(请参阅下面XAML中的Sizes.SelectedItem(。对于ListView中的项目,我对每个项目都有一个DataTemplate。项目的属性Percent通过与Value="{x:Bind Percent, Mode=TwoWay, ...}"绑定的Slider来表示。Slider设置了其MaximumMinimum值,并按照建议首先设置Maximum。但是,当我从Sizes列表中选择一个条目时,ListViewitemsSource被更改,Percent的setter被调用,并且初始有效值都被伪造并设置为Minimum。我现在需要一种方法来确定setter是否在设置阶段被调用,并且可以被忽略,或者setter调用是否来自真实用户,修改Slider位置。

XAML代码:

<ListView x:Name="PropertiesListView"
ItemsSource="{x:Bind Path=((face:Collections) Sizes.SelectedItem).FloatPropertyItems, Mode=OneWay}"
ContainerContentChanging="PropertiesListView_ContainerContentChanging">
<ListView.ItemTemplate>
<DataTemplate x:DataType="localItems:FloatItem">
<StackPanel>
<Grid>
<Slider x:Name="value" Grid.Column="0"
Maximum="{x:Bind Maximum, Mode=OneWay}"
Minimum="{x:Bind Minimum, Mode=OneWay}"                                                
Value="{x:Bind Percent, Mode=TwoWay, FallbackValue=50}"
StepFrequency="0.1" Margin="10,0,10,0"
ValueChanged="value_ValueChanged"/>

我尽了一切努力来了解设置何时开始和何时结束:SelectionChanged, DataContextChanged, ChoosingItemContainer, ManipulationCompleted,当然还有Loaded。但这些都不起作用。唯一有效的解决方案是使用ContainerContentChanging,我通过这种方式找到了一个简单的解决方案:

private void PropertiesListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) {
PropertiesLoading = true;
if (args.Phase >= 1) {
PropertiesLoading = false;
} else {
args.RegisterUpdateCallback(PropertiesListView_ContainerContentChanging);
}
}

Slider具有Percent属性的项目中:

internal double Percent {
get => ...
set {
if (MainPage.PropertiesLoading) {
// This is the setup phase, ignore that.
return;
}
}
}

最新更新