我希望我能以正确的方式解决这个问题,但如果我不这样做,请告知。
我从一个强类型集合循环开始:
foreach (var item in myItems)
{
//magic happens here
}
在foreach循环中,我根据集合将项添加到wrapPanel。 作为其中一部分,每个项目都有一个复选框。此外,集合中的每个项目都有唯一的ID。
我想要的是当单击复选框时,它会从列表中添加或删除项目。但是理想情况下,在现有List中有一个isSelected属性也是很好的。
所以我想把onclick事件处理程序附加到复选框,并以某种方式将id(从UI隐藏)附加到复选框。然后在onclick里面 - 手动处理东西。
有更好的方法吗?
编辑:我现有的代码
foreach (var x in y)
{
Grid lbItem = new Grid();
StackPanel sp = new StackPanel();
sp.Width = 190;
Border border = new Border();
border.Padding = new Thickness(10);
border.BorderBrush = new SolidColorBrush(Colors.Gainsboro);
border.BorderThickness = new Thickness(2);
border.CornerRadius = new CornerRadius(15);
CheckBox cb = new CheckBox();
cb.Content = x.id;
cb.Padding = new Thickness(0,0,5,5);
StackPanel sptitle = new StackPanel();
sptitle.Orientation = Orientation.Horizontal;
sptitle.Children.Add(cb);
TextBlock tbTitle = new TextBlock();
tbTitle.Text = x.title;
tbTitle.TextAlignment = TextAlignment.Justify;
sptitle.Children.Add(tbTitle);
TextBlock tbShortDesc = new TextBlock();
tbShortDesc.FontSize = 8;
tbShortDesc.Text = x.shortDesc;
Image imgDeal = new Image();
imgDeal.Height = 180;
imgDeal.Width = 180;
imgDeal.Source = new BitmapImage(new Uri(@"http://myurl/images/" + x.thumburl));
sp.Children.Add(sptitle);
sp.Children.Add(imgDeal);
sp.Children.Add(tbShortDesc);
border.Child = sp;
lbItem.Children.Add(border);
DealsWrapPanel.Children.Add(lbItem);
Rectangle rect = new Rectangle();
rect.Width = 5;
DealsWrapPanel.Children.Add(rect);
}
答案 0 :(得分:1)
确定。删除所有代码并从头开始。
这是在WPF中执行此操作的正确方法:
<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/> <!-- This is your "DealsWrapPanel -->
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,5,0"> <!-- this is your LBItem, I added the margin because I realized you're using the Rectangle to separate items -->
<Border Padding="10" BorderThickness="2"
BorderBrush="Gainsboro" CornerRadius="15">
<StackPanel Width="190">
<StackPanel Orientation="Horizontal"> <!-- this is your sptitle -->
<CheckBox Padding="0,0,5,5" Content="{Binding id}" IsChecked="{Binding SomeBoolValue}" /> <!-- you need a boolean value to bind to -->
<TextBlock Text="{Binding title}" TextAlignment="Justify"/>
<Image Width="180" Height="180" Source="{Binding thumburl}"/> <!-- you need to append the full url string correctly before passing that to the UI -->
<TextBlock Text="{Binding shortdesc}" FontSize="8"/>
</StackPanel>
</StackPanel>
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl>
(在这里键入XAML以便它可能有问题/拼写错误)
大多数情况下,不需要在WPF中的过程代码中操作UI元素。创建一个合适的ViewModel并让UI使用DataBinding创建自己。
还要记住UI is Not Data,所以每当你需要从这些元素“读取”属性时,你实际上需要从集合中的数据项“读取”属性,那些将是两个 - 绑定到UI。