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

时间:2013-10-06 12:00:30

标签: c# xaml binding windows-phone-8 windows-phone-7.1

我有ObservableCollection个项目很多。每个项目都有名为TextAnzahl的属性。这两个属性应显示在2个不同的文本块中。我已经实现了这一点。在我的AppBar中,我有两个按钮。一个显示下一个项目,一个显示后一个项目。

我能用绑定实现吗?什么是最简单的方法?

2 个答案:

答案 0 :(得分:0)

首先将“Next”和“Previous”按钮绑定到Command并在Command Action中,相对于当前元素设置属性“Foo”和“Bar”(属于绑定到各自文本块的属性)。 / p>

用于遍历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;
}

不要忘记将RaisePropertyChange实现到你的Foo和Bar属性的set方法..

答案 1 :(得分:0)

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

默认情况下,绑定到集合的非TextBlock等列表控件将显示列表中的“当前”项。 WPF保持一个(有点神奇)的集合视图,跟踪当前项目。您可以通过调用CollectionViewSource.GetDefaultView(ObservableCollection)来访问集合视图,并使用返回的{{MoveCurrentToPreviousMoveCurrentToNextIsCurrentBeforeFirstIsCurrentAfterLast上的方法操作当前项1}} interface。

此方案的完整代码:

XAML:

ICollectionView

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

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

希望有所帮助。