C# 动态控制WPF中的按钮数

C# 动态控制WPF中的按钮数,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我最近在WPF工作。现在,我面临一个问题 <TextBox Text="{Binding Name}" Margin="10,10" Height="20" ></TextBox> <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox> <

我最近在WPF工作。现在,我面临一个问题

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
我有一个按钮“添加”,每次点击这个按钮都会添加一个包含一些内容的新行。这些内容如下所示-

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

这里,在末端有三个按钮M1、M2、M3。但是,我不需要每次都用这三个按钮。我可能只需要M1或M2或M3或M1、M2等

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
我怎样才能在c#中做到这一点? 事实上我都不知道,我的方式对吗

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

提前感谢。

您可以通过代码隐藏文件添加按钮,并在按钮周围放置if结构,以确定应加载的按钮。

您可以通过代码隐藏文件添加按钮,并在按钮周围放置if结构,以确定应加载的按钮。

您可以使用如果按钮数量取决于列表/集合的大小,则进行数据绑定

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
<ItemsControl ItemsSource={Binding Ms}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl ItemsSource={Binding}>


这将准确地生成DataContext中Ms集合/列表中的按钮数量。

如果按钮数量取决于列表/集合的大小,则可以使用数据绑定

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
<ItemsControl ItemsSource={Binding Ms}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl ItemsSource={Binding}>

这将准确地生成DataContext中Ms集合/列表中的按钮数量。

您使用的是MVVM吗

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
如果是这样,那么这很容易。只需创建一个表示其中一个按钮的ButtonViewModel对象,并从主ViewModel中显示它们的可见集合

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
在您的视图中,只需要一个ListView,或者一个绑定到集合的ItemsControl,以及一个将ButtonView模型转换为button的DataTemplate

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
当用户单击“添加”按钮时,将一个新的按钮ViewModel添加到您的集合中,视图将自动更新以匹配。

您使用的是MVVM吗

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
如果是这样,那么这很容易。只需创建一个表示其中一个按钮的ButtonViewModel对象,并从主ViewModel中显示它们的可见集合

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
在您的视图中,只需要一个ListView,或者一个绑定到集合的ItemsControl,以及一个将ButtonView模型转换为button的DataTemplate

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

当用户单击“添加”按钮时,向集合中添加一个新的按钮ViewModel,视图将自动更新以匹配。

首先,让我们为行创建一个视图模型。在该模型中,您将有3个bool属性,isbutton1可见、isbutton2可见、isbutton3可见,或者类似的,以及您需要在行上执行绑定的所有属性。
                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

其次,您的场景是,当您单击“添加”时,将添加新行。因此,您有一个行视图模型列表。在AddCommand上,您将在列表中添加一个新行\视图\模型。在这里,您可以完全控制要显示的按钮。

首先,让我们为一行创建一个视图模型。在该模型中,您将有3个bool属性,isbutton1可见、isbutton2可见、isbutton3可见,或者类似的,以及您需要在行上执行绑定的所有属性。
                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

其次,您的场景是,当您单击“添加”时,将添加新行。因此,您有一个行视图模型列表。在AddCommand上,您将在列表中添加一个新行\视图\模型。在这里,您可以完全控制要显示的按钮。

我强烈建议在使用WPF时查看MVVM设计模式

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
也就是说,我会将我的XAML绑定到一个
observedcollection
,然后单击
add按钮将一个新的
SomeObject
添加到
observedcollection
。这将使UI在集合更新时自动添加新行,并且
SomeObject
可以具有
IsM1Visible
ism2 visible
ism3 visible
的属性,这些属性确定了哪些按钮是可见的

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
比如说,

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
SomeObject
将具有

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
string Name;
string City;
int Age;
int Count;
bool IsM1Visible;
bool IsM2Visible;
bool IsM3Visible;
XAML的外观如下所示:

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
<ItemsControl ItemsSource="{Binding SomeCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                <Button Content="M1" Visibility="{Binding IsM1Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M2" Visibility="{Binding IsM2Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M3" Visibility="{Binding IsM3Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
            </WrapPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
void AddButton_Click(object sender, EventArgs e)
{
    var newItem = new SomeItem
        {
            Name = "Something",
            City = "Something",
            Age = 30,
            Count = 2,
            IsM1Visible = true,
            IsM2Visible = false,
            IsM3Visible = true
        };

    SomeCollection.Add(newItem);
}

我强烈建议在使用WPF时研究MVVM设计模式

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
也就是说,我会将我的XAML绑定到一个
observedcollection
,然后单击
add按钮将一个新的
SomeObject
添加到
observedcollection
。这将使UI在集合更新时自动添加新行,并且
SomeObject
可以具有
IsM1Visible
ism2 visible
ism3 visible
的属性,这些属性确定了哪些按钮是可见的

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
比如说,

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
SomeObject
将具有

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
string Name;
string City;
int Age;
int Count;
bool IsM1Visible;
bool IsM2Visible;
bool IsM3Visible;
XAML的外观如下所示:

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>
<ItemsControl ItemsSource="{Binding SomeCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                <Button Content="M1" Visibility="{Binding IsM1Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M2" Visibility="{Binding IsM2Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M3" Visibility="{Binding IsM3Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
            </WrapPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
void AddButton_Click(object sender, EventArgs e)
{
    var newItem = new SomeItem
        {
            Name = "Something",
            City = "Something",
            Age = 30,
            Count = 2,
            IsM1Visible = true,
            IsM2Visible = false,
            IsM3Visible = true
        };

    SomeCollection.Add(newItem);
}