Игнорировать вызовы установки свойств во время настройки элемента пользовательского интерфейса - PullRequest
0 голосов
/ 13 апреля 2020

В UWP у меня есть ListView, для списка предметов. Список можно изменить, изменив выбор в списке Sizes (см. Sizes.SelectedItem в XAML ниже). Для предметов в ListView у меня есть DataTemplate для каждого предмета. Свойство Percent предметов представлено через Slider, которое связано с Value="{x:Bind Percent, Mode=TwoWay, ...}". Для Slider установлены значения Maximum и Minimum, и, как рекомендовано, сначала Maximum. Но все же, когда я выбираю запись из списка Sizes, изменяется ListView itemsSource, вызывается установщик Percent, и все начальные допустимые значения фальсифицируются и устанавливаются в Minimum. Теперь мне нужен способ выяснить, был ли сеттер вызван во время фазы установки и может ли быть проигнорирован, или вызов сеттера поступил от реального пользователя, изменив позицию 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"/>

1 Ответ

0 голосов
/ 13 апреля 2020

Я попробовал все, чтобы получить информацию, когда установка началась и когда она закончилась: 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);
    }
}

И в элементе со свойством Percent для Slider:

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