动态控制WPF中的按钮数量

本文关键字:按钮 WPF 动态控制 | 更新日期: 2023-09-27 18:20:09

我最近正在使用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>

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

我如何在c#中做到这一点?事实上,我甚至不知道,我走的路对吗?

提前谢谢。

动态控制WPF中的按钮数量

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

也就是说,我将XAML绑定到ObservableCollection<SomeObject>,单击AddButton将向ObservableCollection添加一个新的SomeObject。这将使UI在集合更新时自动添加新行,并且SomeObject可以具有IsM1VisibleIsM2VisibleIsM3Visible的属性,这些属性决定哪些按钮可见。

例如,

SomeObject类将具有

string Name;
string City;
int Age;
int Count;
bool IsM1Visible;
bool IsM2Visible;
bool IsM3Visible;

XAML看起来像这样:

<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);
}

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

<ItemsControl ItemsSource={Binding Ms}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

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

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

您在使用MVVM吗?

如果是这样,那么这很容易。只需创建一个表示某个按钮的ButtonViewModel对象,并从主ViewModel中公开这些按钮的ObservableCollection。

在您的视图中,只需有一个ListView,或者只需一个绑定到集合的ItemsControl,以及一个将ButtonViewModel转换为按钮的DataTemplate。

当用户单击"添加"按钮时,将一个新的ButtonViewModel添加到集合中,视图将更新自身以匹配。

首先,让我们为一行创建一个视图模型。在该模型中,您将有3个bool属性,IsButton1Visible、IsButton2Visible、IsButton3Visible或类似的属性,所有属性都需要对行进行绑定。其次,您的场景是,当您单击"添加"时,将添加新行。因此,您有一个Row_View_Model的列表。在AddCommand中,您将在列表中添加一个新的Row_View_Model。在这里,您可以完全控制要显示的按钮。