WPF在组合框上设置隐藏值?

时间:2013-08-09 00:57:25

标签: wpf

我希望我能以正确的方式解决这个问题,但如果我不这样做,请告知。

我从一个强类型集合循环开始:

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

1 个答案:

答案 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。