在UWP中,我有一个ListView
,用于项目列表。可以通过更改Sizes
列表中的选择来更改该列表(请参阅下面XAML中的Sizes.SelectedItem
(。对于ListView
中的项目,我对每个项目都有一个DataTemplate
。项目的属性Percent
通过与Value="{x:Bind Percent, Mode=TwoWay, ...}"
绑定的Slider
来表示。Slider
设置了其Maximum
和Minimum
值,并按照建议首先设置Maximum
。但是,当我从Sizes
列表中选择一个条目时,ListView
itemsSource被更改,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;
}
}
}