动态控制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 时研究MVVM设计模式
也就是说,我将XAML绑定到ObservableCollection<SomeObject>
,单击AddButton
将向ObservableCollection
添加一个新的SomeObject
。这将使UI在集合更新时自动添加新行,并且SomeObject
可以具有IsM1Visible
、IsM2Visible
和IsM3Visible
的属性,这些属性决定哪些按钮可见。
例如,
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。在这里,您可以完全控制要显示的按钮。