Измените источник данных дочернего элемента управления в соответствии с измененным индексом Pivot. - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь изменить источник данных дочернего элемента (в данном случае пользовательский элемент управления) Pivot, когда происходит изменение выбранного индекса. Мой Pivot XAML выглядит следующим образом

            <Pivot x:Name="PivotItemsContainer" ItemsSource="{x:Bind viewModel.headerElement, Mode=OneWay}" SelectionChanged="Pivot_SelectionChanged" >
            <Pivot.HeaderTemplate>
                <DataTemplate x:DataType="models:HeaderUIModel">
                    <TextBlock Text="{Binding Name, Mode=OneWay}"/>
                </DataTemplate>
            </Pivot.HeaderTemplate>
            <Pivot.ItemTemplate>
                <DataTemplate>
                    <local1:AddressInfoControl></local1:AddressInfoControl>
                </DataTemplate>
            </Pivot.ItemTemplate>
        </Pivot>

И при выбранном изменении индекса

        private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        AddressInfoControl aic = new AddressInfoControl();
        switch (PivotItemsContainer.SelectedIndex)
        {
            case 0:
                aic.Numbers = 0;
                break;
            case 1:
                aic.Numbers = 1;
                break;
            default:
                // code block
                break;
        }
    }

Мой код контроля пользователя

 AddressInfoMock aim = new AddressInfoMock();
    private int _numbers;
    public int Numbers
    {
        set
        {
            _numbers = value;

            //when the numbers be changed
            if (Numbers == 0)
            {
                AddressContainer.DataContext = aim.GetRightBoxDetails();
            }
            else
            {
                AddressContainer.DataContext = aim.GetLeftBoxDetails();

            }

        }
        get
        {
            return _numbers;
        }
    }

    public AddressInfoControl()
    {

        InitializeComponent();
        if (Numbers == 0)
        {
            AddressContainer.DataContext = aim.GetRightBoxDetails();
        }
        else
        {
            AddressContainer.DataContext = aim.GetLeftBoxDetails();
        }

    }

}

Этот код всегда принимает числа как 0 при выбранном изменении индекса. Я считаю, что это происходит из-за InitializeComponent();. Как я могу сделать эту работу. Так что когда выбранный индекс равен 0, я получаю данные правого ящика, а когда он равен 1, я получаю данные левого ящика?

1 Ответ

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

Если вы хотите изменить свойство Numbers на основе selectedIndex из pivotItem, вы можете объявить Numbers DependencyProperty , а затем использовать ElementName для привязки к SelectedIndex of Pivot. В этом случае вам не нужно подписываться на событие SelectionChanged.

.xaml:

<Pivot x:Name="PivotItemsContainer" SelectedIndex="0" ItemsSource="{x:Bind viewModel.headerElement, Mode=OneWay}">
    <Pivot.HeaderTemplate>
        <DataTemplate x:DataType="local:UIModel">
            <TextBlock Text="{Binding Name, Mode=TwoWay}"/>
        </DataTemplate>
    </Pivot.HeaderTemplate>
    <Pivot.ItemTemplate>
        <DataTemplate>
            <local:AddressInfoControl Numbers="{Binding ElementName=PivotItemsContainer,Path=SelectedIndex}"></local:AddressInfoControl>
        </DataTemplate>
    </Pivot.ItemTemplate>
</Pivot>

UserControl.cs:

public static readonly DependencyProperty NumbersProperty = DependencyProperty.Register(
    "Numbers",
    typeof(int),
    typeof(AddressInfoControl),
    new PropertyMetadata(null, new PropertyChangedCallback(OnLabelChanged))
);

private static void OnLabelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    int s = (int)e.NewValue; //the newValue of Numbers
    if (s == 0)
    {
        //rightbox 
    }
    else if(s == 1)
    {
        //leftbox

    }
}

public int Numbers
{
    get { return (int)GetValue(NumbersProperty); }
    set { SetValue(NumbersProperty, value); }
}

public AddressInfoControl()
{
    this.InitializeComponent();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...