C# 带有按钮和文本块的可观察集合

C# 带有按钮和文本块的可观察集合,c#,xaml,binding,windows-phone-8,windows-phone-7.1,C#,Xaml,Binding,Windows Phone 8,Windows Phone 7.1,我有一个包含许多项目的可观察集合。每个项目都有名为Text和Anzahl的属性。这两个属性应显示在两个不同的文本块中。我已经做到了这一点。在我的AppBar中,我有两个按钮。一个用于显示下一个项目,一个用于后退一步 我可以通过绑定实现这一点吗?最简单的方法是什么?首先将“下一步”和“上一步”按钮绑定到命令,并在命令操作中,设置与当前元素相关的属性“Foo”和“Bar”(这些属性绑定到各自的文本块) 为了在ObservableCollection中进行迭代,请在类范围内维护一个索引变量,如 int

我有一个包含许多项目的
可观察集合
。每个项目都有名为
Text
Anzahl
的属性。这两个属性应显示在两个不同的文本块中。我已经做到了这一点。在我的
AppBar
中,我有两个按钮。一个用于显示下一个项目,一个用于后退一步

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

首先将“下一步”和“上一步”按钮绑定到命令,并在命令操作中,设置与当前元素相关的属性“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方法实现raiseproperty更改。

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

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

此场景的完整代码:

XAML:


希望这会有所帮助。

为了有效解决您的问题,查看您已经完成的工作的代码会有所帮助。我有一个名为MainListe的可观察集合,其中包括一个名为“Text”和“Anzahl”的字段。我把这两个绑在我的箱子上。它工作得很好,但现在我只想在集合中切换按钮。它被划分为许多大类,因此很难过滤重要的内容。如果您能告诉我如何实现按钮操作,这样用户就可以单步完成每个项目,那就太好了。
observedcollection
绑定到了什么?列表框?数据网格?如何将
TextBlock
绑定到列表中的特定项?它们是在该容器的DataTemplate中定义的吗?Obeservable集合被设置为两个TextBlock的数据上下文。textblock.text绑定到每个项的属性。
<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; }
}
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();
    }
}