0

我有ObservableCollection很多物品。每个项目都有名为Text和的属性Anzahl。这 2 个属性应显示在 2 个不同的文本块中。我已经做到了。在我的AppBar,我有两个按钮。一个用于显示下一个项目,一个用于后退。

我可以通过绑定来实现吗?最简单的方法是什么?

4

2 回答 2

0

正如其他人所提到的,当我们没有上下文时,很难准确地提供帮助。将您的问题提炼成最小的代码表示会非常有帮助。例如,如果您的控件绑定到类上的单个属性,Rushi Soni 的答案将起作用,但如果您将TextBlocks 直接绑定到您的 s ,则还有另一个答案ObservableCollection

默认情况下,TextBlock绑定到集合的非列表控件将显示列表中的“当前”项。WPF 维护一个跟踪当前项目的集合的(有点神奇的)视图。您可以通过使用方法、、、和在返回的接口上调用CollectionViewSource.GetDefaultView(ObservableCollection)和操作当前项目来访问集合视图。MoveCurrentToPreviousMoveCurrentToNextIsCurrentBeforeFirstIsCurrentAfterLastICollectionView

此场景的完整代码:

XAML:

<UserControl.Resources>
    <!-- the MyCollection type is derived from ObservableCollection<MyItem> -->
    <my:MyCollection x:Key="myCollection">
        <my:MyItem Text="One" Anzhal="1"/>
        <my:MyItem Text="Two" Anzhal="2"/>
        <my:MyItem Text="Three" Anzhal="3"/>
    </my:MyCollection>
</UserControl.Resources>

<!-- data context of the top level control is the observable collection defined here in XAML, but
could also be created and assigned in code -->
<DockPanel Name="grid1" DataContext="{StaticResource myCollection}"  >
    <!-- navigation controls -->
    <Grid DockPanel.Dock="Top" >
        <Button HorizontalAlignment="Left" Content="&lt; Previous" Name="buttonPrev" Click="buttonPrev_Click" />
        <Button HorizontalAlignment="Right" Content="Next &gt;" Name="buttonNext" Click="buttonNext_Click" />
    </Grid>

    <!-- display of the current item -->
    <TextBlock Padding="5" DockPanel.Dock="Top" Text="{Binding Text}" />
    <TextBlock Padding="5" DockPanel.Dock="Top" Text="{Binding Anzhal}" />

    <!-- list display of all items (not necessary but helpful for visualizing the behavior) -->
    <ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Text" />
</DockPanel>

集合和包含的项目的类定义:

public class MyCollection : ObservableCollection<MyItem> { }

public class MyItem
{
    // NOTE: these must be get/set properties in order for binding to work
    public string Text { get; set; }
    public int Anzhal { get; set; }
}

以及处理 Next/Previous 按钮点击的代码,它演示了到达集合末端时的环绕:

ICollectionView GetView()
{
    // use FindResource() to retrieve the collection since it is defined in XAML
    // Then we retrieve WPF's view into the collection so we can manipulate the 
    // current item (next, previous)

    return CollectionViewSource.GetDefaultView(FindResource("myCollection"));
}

private void buttonNext_Click(object sender, RoutedEventArgs e)
{
    var view = GetView();

    // wrap around behavior
    view.MoveCurrentToNext();
    if (view.IsCurrentAfterLast) {
        view.MoveCurrentToFirst();
    }
}

private void buttonPrev_Click(object sender, RoutedEventArgs e)
{
    var view = GetView();

    // wrap around behavior
    view.MoveCurrentToPrevious();
    if (view.IsCurrentBeforeFirst) {
        view.MoveCurrentToLast();
    }
}

希望有帮助。

于 2013-11-01T17:36:37.233 回答
0

首先将“下一个”和“上一个”按钮绑定到命令,然后在命令操作中,针对当前元素设置属性“Foo”和“Bar”(它们是绑定到各自文本块的属性)。

用于遍历 ObservableCollection 在类范围内维护一个索引变量,例如

int iterator=0;

并且在你的行为(上一个和下一个)中这样做

public void NextAction()
{
    iterator++;
    Foo=MainList[iterator].Text;
    Bar=MainList[iterator].Anzal;
}

public void PreviousAction()
{
    iterator--;
    Foo=MainList[iterator].Text;
    Bar=MainList[iterator].Anzal;
}

并且不要忘记对您的 Foo 和 Bar 属性的 set 方法实施 RaisePropertyChange..

于 2013-10-06T12:45:17.383 回答