首页 > 解决方案 > 在 UI 元素设置期间忽略属性设置调用

问题描述

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

标签: c#uwpuwp-xaml

解决方案


我尝试了一切以了解设置何时开始以及何时结束: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;
        }
    }
}

推荐阅读