简体   繁体   English

根据 Pivot 选择索引更改更改子控件数据源

[英]Change child control data-source according to Pivot selected index change

I am trying to change the data source of a child element (in this case a custom user control) of Pivot, when a selected index change occurs.当发生选定索引更改时,我正在尝试更改 Pivot 的子元素(在本例中为自定义用户控件)的数据源。 My Pivot XAML looks like this我的 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>

And on selected index change并在选定的索引更改上

        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;
        }
    }

My usercontrol code我的用户控制代码

 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();
        }

    }

}

This code always takes Numbers as 0 on selected index change.此代码在选定的索引更改时始终将 Numbers 设为0 I believe this is happening because of InitializeComponent();我相信这是因为InitializeComponent(); . . How can i make this work.我怎样才能使这项工作。 So that when selected index is 0 I get rightbox data and when it is 1 I get leftbox data? So that when selected index is 0 I get rightbox data and when it is 1 I get leftbox data?

If you want to change Numbers property based on the selectedIndex of pivotItem, you can declare a Numbers DependencyProperty and then use ElementName to bind with the SelectedIndex of Pivot.如果要根据 pivotItem 的 selectedIndex 更改 Numbers 属性,可以声明一个 Numbers DependencyProperty ,然后使用 ElementName 与 Pivot 的 SelectedIndex 绑定。 In that case, you don't need to subscribe the SelectionChanged event.在这种情况下,您不需要订阅 SelectionChanged 事件。

.xaml: .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:用户控制.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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM