依赖属性混淆了吗?

时间:2013-09-20 13:20:03

标签: c# windows-phone-7 windows-phone-8 windows-phone dependency-properties

我基本上有一个包含2个全景项目的全景控件,它只包含不同项目的列表。我按照Windows手机上的教程检测用户何时到达列表末尾,然后显示新项目 - fire (call) method, when scrollviewer scrolled to its end

然而我的问题是我需要这两个列表框,所以我确实注册了2个不同的依赖属性,但是如何将依赖属性“链接”到特定的列表框,因为这两个混合起来。

谢谢

listbox 1

  <ListBox Foreground="Black" 
                         x:Name="nuus"
                         Loaded="nuus_Loaded_1"
                         ItemsSource="{Binding Story}"
                         SelectionChanged="nuus_SelectionChanged_1">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="12,2,0,4" Height="105" Width="432">
                                <Image Width="115" Height="115" Source="{Binding ImageUrl}"/>
                                <StackPanel Width="311" Margin="8,0,0,0">
                                    <TextBlock Text="{Binding Title}" 
                                           TextWrapping="Wrap" 
                                           FontWeight="Bold"
                                           Margin="10,0" 
                                           Foreground="Black"
                                           FontSize="20"/>

                                    <TextBlock Text="{Binding CreationDate}" 
                                           TextWrapping="Wrap" 
                                           Foreground="Black"
                                           Margin="10,-2,10,0" 
                                           FontSize="20"/>
                                </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

1 个答案:

答案 0 :(得分:0)

这是一个帮助程序类,它提取的功能相同,可以更容易地复制它:

public class ScollViewerEndListener :FrameworkElement
{

    public event EventHandler EndOfScrollReached;

    private ScrollViewer scrollViewer;
    public ScollViewerEndListener()
    {

    }

    public void Init(ScrollViewer scrollViewer)
    {
        this.scrollViewer = scrollViewer;
        var binding = new Binding
        {
            Source = scrollViewer,
            Path = new PropertyPath("VerticalOffset"),
            Mode = BindingMode.OneWay
        };
        SetBinding(ListVerticalOffsetProperty, binding);
    }



    private void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var atBottom = scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight;
        if (atBottom)
        {
            if (EndOfScrollReached != null)
            {
                EndOfScrollReached(this, null);
            }
        }
    }

    public readonly DependencyProperty ListVerticalOffsetProperty;

    public double ListVerticalOffset
    {
        get { return (double)GetValue(ListVerticalOffsetProperty); }
        set { SetValue(ListVerticalOffsetProperty, value); }
    }
}

您可以在文件中使用,如下所示:

ScollViewerEndListener scrollListenerFirstListBox=new ScollViewerEndListener ();
ScollViewerEndListener scrollListenerSecondListBox=new ScollViewerEndListener ();

在构造函数中:

scrollListenerFirstListBox.EndOfScrollReached += scrollListenerFirstListBox_EndOfScrollReached;
scrollListenerSecondListBox.EndOfScrollReached += scrollListenerSecondListBox_EndOfScrollReached;

加载第一个列表框时:

 scrollListenerFirstListBox.Init(ScrollViewerFirstListBox);

加载第二个列表框时:

scrollListenerSecondListBox.Init(ScrollViewerSecondListBox);

这是一个从ListBox获取scrollviewer的函数:

public ScrollViewer GetScrollViewer(DependencyObject parentElement)
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);


        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);
            if (child is ScrollViewer)
            {
                return child as ScrollViewer;
            }
            else
            {
                child = GetScrollViewer(child);
                if (child != null)
                {
                    return child as ScrollViewer;
                }
            }
        }
        return null;
    }

你应该在ListBox中加载这个函数,就像这样:

ScrollViewer scrollViewerListA=this.GetScrollViewer(ListA);

另外需要提及的是,如果您要做的是创建无限滚动,那么推荐的方法是使用windows phone toolkit LongListSelector并遵循此article