【问题标题】:How to call a userControl(child) in another UserControl(Container)如何在另一个 UserControl(Container) 中调用 userControl(child)
【发布时间】:2018-12-10 15:07:58
【问题描述】:

现在我有一个包含其他类和 UserControls 的 WPF 项目,现在我被卡住了! 如您所见,我拥有的 xaml 文件包含 2 个与不同数据(输入和输出)相似的块

 <!--Block 1-->
    <GroupBox Grid.Column="0" Grid.Row="0" Header="Inputs">
        <StackPanel  Orientation="Vertical">
                    <DataGrid x:Name ="GridI"  Style="{x:Null}"
                    ItemsSource= "{Binding input_List}"

                  AutoGenerateColumns="False" CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
                  Margin="5,0" IsReadOnly="True" SelectionMode="Single" RowHeight="50" Height="Auto">


                        <DataGrid.Columns>

                            <DataGridTextColumn Width="40*" Binding="{Binding label}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text="Input"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>

                            <DataGridTextColumn  Width="40*" Binding="{Binding type}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text = "Type"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>


                            <DataGridTemplateColumn Width="20*">
                                <DataGridTemplateColumn.Header>
                                    <TextBlock Text="value" />
                                </DataGridTemplateColumn.Header>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel>
          //datas
                                        </StackPanel>

                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                        </DataGrid.Columns>
                    </DataGrid>

        </StackPanel>

    </GroupBox>

    <!--Block 2 : outputs-->
    <GroupBox Grid.Column="1" Grid.Row="0" Header="Outputs">
        <StackPanel  Orientation="Vertical" >

                    <DataGrid x:Name ="GridO"  Style="{x:Null}"
                    ItemsSource= "{Binding output_List}"

                  AutoGenerateColumns="False" CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
                  Margin="5,0" IsReadOnly="True" SelectionMode="Single" RowHeight="50" Height="Auto">


                        <DataGrid.Columns>

                            <DataGridTextColumn Width="40*" Binding="{Binding label}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text="Input"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>

                            <DataGridTextColumn  Width="40*" Binding="{Binding type}">
                                <DataGridTextColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock  Text = "Type"></TextBlock>
                                    </DataTemplate>
                                </DataGridTextColumn.HeaderTemplate>
                            </DataGridTextColumn>


                            <DataGridTemplateColumn Width="20*" >
                                <DataGridTemplateColumn.Header>
                                    <TextBlock Text="value" />
                                </DataGridTemplateColumn.Header>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel>

                                              //Datas

                                        </StackPanel>

                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                        </DataGrid.Columns>
                    </DataGrid>
    </GroupBox>

我想要做的是创建另一个 UserControl(子)我的项目,我将在其中编写仅一个块的代码,并且此 UserControl(子)将在父 UserControl 中调用两次(这是一种代码优化)

This Image can explain more

由于我是 WPF 新手,您能帮我怎么做吗 是否必须添加任何 C# 代码,或者我只能使用 xaml 来执行此操作 是否必须将任何修改添加到我的 APP.xaml 谢谢你

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。在最终添加答案之前,请检查这是否适合您:stackoverflow.com/questions/35399129/…
  • @DanieleSartori 我试过这个但是不,这不是我被要求做的(这不是我的选择,这是老板的选择)他要求一个具有数据网格结构的 UserControl(儿童UC)可以在其他用户控件中调用我现在已经卡了 7 天了:/
  • 这正是那个问题的答案。 2 GroupBox 具有完全相同的结构,只是它们具有不同的项目来源。您可以在项目的目录中简单地创建一个用户控件,使用名为 ItemSource 的自定义依赖项属性(如我的链接中的答案),然后在您的父窗口中将其放在容器内(网格、边框或任何您想要的)

标签: c# wpf


【解决方案1】:

从您的图片中计算出这个用户控件将是什么并编写代码是很棘手的。原则上,您只需创建一个新的用户控件,添加其中两个并根据它们/它要执行的操作绑定到相同或不同的属性。

现在在 Visual Studio 中,当您创建窗口或用户控件时,它会为您添加一个 local:xmlns。 如果您在同一个命名空间中添加新的用户控件(称为 SharedUC ),那么您可以在 xaml 中的任何位置使用它,例如:

  <local:SharedUC DataContext="{Binding SomeProperty}"

然后,您可以为两个实例的数据上下文使用两个不同的属性。还是一样。

该属性可以是复杂类型。 因此,您可以将描述或其他任何内容作为对象的属性呈现为数据上下文。然后,您的用户控件可以绑定到 Description 以在文本块中显示字符串。

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多