【问题标题】:C# Add items from listbox to UsercontrolC#将列表框中的项目添加到用户控件
【发布时间】:2016-04-12 22:02:35
【问题描述】:

我是一名新程序员。我会尽力解释。我正在编写 WPF 中的工具。我做了一个用户控件如下。

User control

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="30"></ColumnDefinition>
        <ColumnDefinition Width="150"></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition Width="50"></ColumnDefinition>
        <ColumnDefinition Width="30"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Button x:Name="DelOutConBT" Margin="5" Content="X" Click=" Delete ConnSet"></Button>
    <Label x:Name="OutConLB" Grid.Column="1" ></Label>
    <ComboBox x:Name="InConComB" Grid.Column="2"></ComboBox>
    <TextBox x:Name="ConnValueTX" Grid.Column="3" Margin="5"></TextBox>
    <Button Grid.Column="4" Margin="5" Content=">>"></Button>
</Grid>

在主窗口中,我已经编写了一个列表框和一个选项卡。列表框将填充一些运行 Python 脚本的项目。

现在,我想让用户通过在列表框中选择一个项目并单击主窗口中的按钮来添加用户控件。

我的问题是用户控件如何在添加时自动加载信息。我希望用户控件中的标签显示从列表框中选择的项目,而组合框显示列表框中的所有项目。

然后,通过单击用户控件中的“>>”按钮,可以将用户控件中的数据保存到类或其他。因为我将使用另一个 Python 脚本填充用户控件中的所有数据。

这是我编写的将用户控件添加到主窗口的程序。

Mainwindow.xaml.cs

private void ConSel_Click(object sender, RoutedEventArgs e)
{
    if (ListB.SelectedItem != null)
    {
        string name = ((ListBoxItem)ListB.SelectedItem).Name;                
        ConnSet CSobj = new ConnSet();
        StkConn.Children.Add(CSobj);                
    }                        
}

【问题讨论】:

  • 您应该使用 ItemsControl 中的 TemplateSelector 来执行此操作。这样会比较容易。

标签: c# wpf user-controls


【解决方案1】:

我认为您正在寻找的是列表视图的“样式”。你的问题不是很清楚,所以我不能准确地给你你在找什么,但这里有一个 ListView 使用绑定的例子,可以满足你的需要:

用户界面:

<ListBox ItemsSource="{Binding Items}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30"/>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="50"/>
                    <ColumnDefinition Width="30"/>
                </Grid.ColumnDefinitions>
                <Button x:Name="DelOutConBT" Margin="5" Content="X" Click=" Delete ConnSet"/>
                <Label x:Name="OutConLB" Grid.Column="1" ></Label>
                <ComboBox x:Name="InConComB" Grid.Column="2"></ComboBox>
                <TextBox x:Name="ConnValueTX" Grid.Column="3" Margin="5"></TextBox>
                <Button Grid.Column="4" Margin="5" Content=">>"></Button>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

代码隐藏:

public ObservableCollection<ConnSet> Items { get; set; }

private void ConSel_Click(object sender, RoutedEventArgs e)
{
    if (ListB.SelectedItem != null)
    {
        string name = ((ListBoxItem)ListB.SelectedItem).Name;                
        ConnSet CSobj = new ConnSet();
        Items.Add(CSobj); // with the correct bindings, this will push to the UI for you
    }                        
}

快速编辑:xaml 代码中发生的情况是,它表示“对于每个项目,请遵循此模板进行设计”,因此当添加新项目时,它会查看该模板并为您布置所有内容。

请注意,如果您使用 WPF,我建议您研究 MVVM 或 MVC 模式。从我所见,这就是 WPF 的设计用途。有很多关于这个主题的好书,你可以看看。希望这有帮助!

【讨论】:

  • 首先,感谢您的帮助。我试图解释得更清楚。我不希望在列表框中添加用户控件。我想将它添加到选项卡中。主窗口中的列表框和选项卡已经完成。我的问题是 UI 的组合框如何从列表框中加载所有项目,而标签如何加载从列表框中选择的项目。希望它更清楚。 >.
  • 我想我对你的理解更好一些。我认为你想要做的是在第二个选项卡中放置一个“StackPanel”并命名,然后将控件放在其中。 然后:ControlHost.Children.Add(CSobj);
  • 如果这回答了您的问题,您能否将其标记为“已回答”,我可以在我的回答中添加第二条评论,以便其他人可以从该解决方案中受益?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多