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="< Previous" Name="buttonPrev" Click="buttonPrev_Click" />
<Button HorizontalAlignment="Right" Content="Next >" 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();
}
}