【问题标题】:How to check to state of controls created dynamically using itemscontrol after naming them in the itemscontrol wpf C#在itemscontrol wpf C#中命名后,如何检查使用itemscontrol动态创建的控件的状态
【发布时间】:2018-05-05 19:13:48
【问题描述】:

对于我的代码,我使用绑定到类“MyClass”的 itemscontrol 创建了多个相同类型的控件(即 Checkbox)。我已将复选框控件命名为“checkControl”。现在,由于我在 UI 中创建了多个复选框控件,我想检查它们的状态并区分它们。我应该如何进行?我正在考虑使用 findvisualchild 和 findvisualparent?但是,我不知道如何使用它?

<ItemsControl Name="myList">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Margin="30,80,10,0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>

                <Border x:Name="tempBorder" BorderBrush="LightGray" BorderThickness="2,2,2,2" CornerRadius="4,4,4,4" Margin="0,-30,-60,-30"
                                            Background="LightGray">
                    <StackPanel Orientation="Horizontal" Background="Transparent" Margin="0">
                        <StackPanel Background="White" Orientation="Horizontal">
                            <CheckBox x:Name="checkControl" Margin="7,7,0,0" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
                                <WrapPanel>
                                    <Image Source="/Images/myimage.png" Margin="0,10,0,0"></Image>
                                        <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                                            <TextBlock Text="{Binding Disk}" FontFamily="roboto" FontSize="14"/>
                                            <Rectangle Width="340" Height="1" Margin="0,5,5,5" Fill="Black"/>
                                            <TextBlock>
                                                <Run Text="Item:" FontFamily="roboto" FontSize="14"/>
                                                <Run Text="{Binding Path=Name, StringFormat=' {0} Jr.'}" FontSize="20" Foreground="Orange"
                                                                 FontWeight="DemiBold"/>
                                            </TextBlock>
                                        </StackPanel>
                                    </WrapPanel>
                                </CheckBox>
                            </StackPanel>
                            <StackPanel Orientation="Vertical" Background="LightGray" Margin="0" HorizontalAlignment="Center" Width="765"
                                                        VerticalAlignment="Center">
                                <TextBlock Text="Select the Option:" Margin="15,7,0,7" FontFamily="roboto"/>
                                <ComboBox x:Name="comboControl" Margin="15,5,0,7" Width="750" SelectionChanged="comboControl_SelectionChanged"/>
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

对于我的后端 C# 代码: 类

 public class MyClass
{
    public string Disk { get; set; }

    public string Name { get; set; }

    public MyClass()
    {

    }

    public MyClass(string album, string name)
    {
        this.Disk = album;
        this.Name = name;
    }
}

在我的 Xaml.cs 中

public ObservableCollection<MyClass> StudentDisk { get; set; }
//somecode
StudentDisk.Add(new MyClass("Disk 4 ", "John"));   //For populating
//somecode
myList.ItemsSource = StudentDisk;

【问题讨论】:

  • “对于我的代码...”,什么代码?请出示。
  • 将 itemssouce 绑定到某个类的 observablecollection,其中包含每个项目所需的所有属性。将公共 bool 属性从该属性绑定到 ischecked。使用 itemtemplate 将它们模板化到您的复选框中。然后,您可以在该集合上使用 linq 来挑选 tge 检查的并做任何事情。使用数据而不是用户界面。
  • @Andy 我完全不明白!你能帮我举个例子吗

标签: c# wpf windows


【解决方案1】:

可以通过 DataContext 来区分复选框,这应该是唯一的:

void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    var checkbox = (CheckBox)sender;
    var item = (MyClass)checkbox.DataContext;
    MessageBox.Show(item.Disk + " " + item.Name);
}

【讨论】:

  • 嗨@ASh,当我通过单击下一步按钮移动到下一个 UI 时,我需要获取 ischecked 属性,所以,这并不能完全回答它,所以我需要访问所有使用 visualtree 的复选框(我现在还不能这样做)或通过将 ischecked 属性与绑定类相关联!!
  • 我可以使用 visualparent 和 visualchild 而不是全部访问第一个复选框控件!
  • 为什么不在 MyClass 中创建 bool IsChecked {get;set;} 属性,并将 CheckBox.isChecked 绑定到它 IsChecked="{Binding IsChecked}"?那么你可以从 StudentDisk 集合中获取所有选中的项目,而不会弄乱可视化树,因为虚拟化,它不包含所有项目
  • 谢谢!!我之前尝试过,但我错过的是绑定模式需要设置为双向绑定或绑定到源,因为我希望 UI 更改反映在后端!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多