WPF:什么更易于动态开发?

WPF:什么更易于动态开发?,wpf,dynamic,user-interface,datagrid,grid,Wpf,Dynamic,User Interface,Datagrid,Grid,我有一个DataGrid(dataGrid1),可以在其中添加和删除记录 基于dataGrid1,我想创建一个新的网格,其中包含基于ID和类型的按钮。Cols还必须动态地提供一个add数据源,但这将是在Window_加载自身时第一次生成。可以根据dataGrid1中的更改添加/删除行。我想要这样的东西: 每次点击Btn时,将打开一个新窗口,用于输入特定类型和特定ID。如果已输入详细信息,则Btn的文本将为“更新”或“添加” 执行此操作的最佳资源/控制是什么?目前,我只是做了一个网格与2个稳定的

我有一个DataGrid(dataGrid1),可以在其中添加和删除记录

基于dataGrid1,我想创建一个新的网格,其中包含基于ID和类型的按钮。Cols还必须动态地提供一个add数据源,但这将是在Window_加载自身时第一次生成。可以根据dataGrid1中的更改添加/删除行。我想要这样的东西:

每次点击Btn时,将打开一个新窗口,用于输入特定类型和特定ID。如果已输入详细信息,则Btn的文本将为“更新”或“添加”

执行此操作的最佳资源/控制是什么?目前,我只是做了一个网格与2个稳定的科尔。上面提到的任何使用网格、数据网格或其他东西的想法。以何种方式和方式添加/删除行将很容易


非常感谢您的帮助。

好的,让我试着举一个与您的需求类似的例子

假设我们使用这个类:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}
我们愿意显示一个列有ID的
DataGrid
,第二列有一个
按钮
,属性为
MyString
,当单击该按钮时,会启动
ICommand
MyCommand
,在新窗口中打开任何您想要的内容

以下是您应该在视图侧看到的内容:

    <DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding MyID}" />
            <DataGridTemplateColumn Header="Buttons">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="{Binding MyString}" Command="{Binding MyCommand}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
这应该足以创建您想要的任何内容。如您所见,每个
按钮
都将调用一个方法(
ShowWindow
),该方法被定义为显示您的新窗口,在其中执行您需要的任何操作。正如它的名字所说,
RelayCommand
实际上就在这里,它将按钮触发的命令中继到包含执行逻辑的方法

而且。。。我想这就是你所需要的。顺便说一句,很抱歉回答晚了

编辑-手动/动态生成列

下面的代码是我遇到类似问题时必须执行的代码的一部分。 我的问题是,每次
组合框的
SelectedItem
发生变化时,我都需要更改显示的列。所以我把它放在一个
SelectionChanged
事件处理程序中。 我不知道你到底需要在哪里生成你的列,但我会给你一个一般的例子

假设您的
ItemsSource
是一个
observedcollection

MyNewObject
如下所示:

public class MyNewObject
{
   public IList<string> MyStrings { get; set; }
}

这将为在第一个对象中找到的每个字符串创建一列。然后,用你需要的任何命令或显示技巧来增强它

你应该检查MVVM模式(如果你还不知道的话),它提供了你想要的:获取一个
DataGrid
,将它绑定到你需要的任何对象的
ObservableCollection
,向集合中添加一个对象将向
DataGrid
添加一行,反之亦然。@Damascus,我已经有了一个绑定到ObservableCollection的DataGrid。根据在该数据网格中添加/删除的行,我希望该网格中有行。你能给我举一个例子,说明如何向网格中添加相同的按钮,即ObsevableCollection。@大马士革,除了第一个,我将在所有列中都有按钮。我可以将按钮添加到对象作为ObservableCollection的源吗?我的意思是,如果T=Tender,那么我可以拥有它的列表成员吗?你不应该将IEnumerable用作
项目资源。绑定的目标是避免在UI元素上工作,您应该使用类似于
列表的东西作为
项目资源
,然后为
数据网格定义一个
模板
,为每一行定义一个按钮。如果您需要一个代码片段,我很乐意将其作为答案发布,尽管我不确定它是否能回答您最初的问题^^^@Damascus,如果您能提供一个代码片段,没有类似的。在不同行的每个btn上,我打开了一个新窗口。对于这一点,什么也更合适。我刚找到ICommand,但无法实现它。请提供代码片段作为答案。我很困惑,这些COL将被动态添加,以及如何构建ObservableCollection。非常感谢。你的命令肯定会帮我的。但我开始工作的第一步是在同一个地方。将动态添加COL,我不知道将添加多少btn COL。所以在这种情况下,MyString对象必须是一个集合。DataTemplate还可以有N个按钮,因此也是动态的。按钮的内容类似于MyString[i]。您的代码在某种程度上非常有用和相关。如果你能展示一个MyString的集合,并将其绑定到按钮上,那将是一件很棒的事情,而这正是我被卡住的地方。在你的问题中有一件事我不明白:不是每个对象都有相同数量的按钮吗?如果每个对象生成的列数不同,您将如何将其放入数据网格中?默认情况下,WPF
DataGrid
为对象的每个属性生成一列。您的意思是您将拥有可变数量的属性?列的数量将取决于主控。master有多少记录,我在数据网格中有多少Col。在代码中初始化DG时,我将使用cols的#。但我的资料来源将不得不有一些收集,因为在设计时我不知道大师的记录。如何处理具有集合属性的源obj?嗯。。。我不确定
DataGrid
是否是一个好方法。但是,你仍然可以准备一个解决方案,我将编辑我的帖子,向你展示如何做到这一点。不客气,这就是Stackoverflow的全部内容!我知道
DataGrids
可能是一个真正的痛苦,因为我开发了很多与Datagrid相关的东西,所以我能做的最好的事情就是分享我关于这个主题的知识/痛苦。
public class MyNewObject
{
   public IList<string> MyStrings { get; set; }
}
ObservableCollection<MyNewObject> source = dataGrid.ItemsSource as ObservableCollection<MyNewObject>;

if (source == null || source.Count == 0)
{
  return;
}
MyNewObject firstObject = source[0];

for(int i = 0; i < firstObject.MyStrings.Count; i++)
{
   // Creates one column filled with buttons for each string
   DataGridTemplateColumn columnToAdd = new DataGridTemplateColumn();
   columnToAdd.Width = 110; // I set a manual width, but you can do whatever you want
   columnToAdd.Header = "Header number " + i;

    // Create the template with a Button inside, bound to the appropriate string
    DataTemplate dataTemplate = new DataTemplate(typeof(Button));
    FrameworkElementFactory buttonElement = new FrameworkElementFactory(typeof(Button));

    Binding binding = new Binding("MyStrings[" + i + "]");
    binding.Mode = BindingMode.TwoWay;
    binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

    buttonElement.SetBinding(Button.ContentProperty, binding);

    // Do the same here for your command, or for whatever you want to do when the user clicks on this button

    dataTemplate.VisualTree = buttonElement;
    columnToAdd.CellTemplate = dataTemplate;
    dataGrid.Columns.Add(columnToAdd);
}