c# - 在 UI 元素设置期间忽略属性设置调用
问题描述
在 UWP 中,我有一个ListView
, 用于项目列表。可以通过更改列表中的选择来更改Sizes
列表(请参阅Sizes.SelectedItem
下面的 XAML)。对于每个项目ListView
我都有一个DataTemplate
项目。项目的属性Percent
通过Slider
绑定来表示Value="{x:Bind Percent, Mode=TwoWay, ...}"
。Slider
设置了它的和Maximum
值Minimum
,并且按照推荐的Maximum
第一个。但是,当我从Sizes
列表中选择一个条目时,ListView
itemsSource 被更改,setterPercent
被调用,并且初始有效值都被伪造并设置为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
. 但这些都不起作用。唯一可行的解决方案是 with ContainerContentChanging
,我通过这种方式找到了一个简单的解决方案:
private void PropertiesListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) {
PropertiesLoading = true;
if (args.Phase >= 1) {
PropertiesLoading = false;
} else {
args.RegisterUpdateCallback(PropertiesListView_ContainerContentChanging);
}
}
在具有以下Percent
属性的项目中Slider
:
internal double Percent {
get => ...
set {
if (MainPage.PropertiesLoading) {
// This is the setup phase, ignore that.
return;
}
}
}