我最近和WPF合作。现在,我正面临一个问题。
我有一个“ADD”按钮,每次点击此按钮都会添加一个包含一些内容的新行。这些内容如下所示 -
<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#中这样做? 其实我甚至不知道,我是以正确的方式吗?
提前致谢。
答案 0 :(得分:2)
我强烈建议在使用WPF时查看MVVM设计模式
也就是说,我会将我的XAML绑定到ObservableCollection<SomeObject>
,然后点击AddButton
会向SomeObject
添加新的ObservableCollection
。这将使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>
Add Button的Click事件看起来像这样:
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);
}
答案 1 :(得分:1)
如果按钮数量取决于列表/集合的大小,则可以使用DataBinding。
<ItemsControl ItemsSource={Binding Ms}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl ItemsSource={Binding}>
这将生成DataContext中Ms集合/列表中的按钮数量。
答案 2 :(得分:0)
您可以通过代码隐藏文件添加按钮,并在按钮周围放置一个if结构,以确定应该加载哪个按钮。
答案 3 :(得分:0)
您使用的是MVVM吗?
如果是这样,那么这很容易。只需创建一个ButtonViewModel对象,该对象代表您的一个按钮,并从您的主ViewModel公开它们的ObservableCollection。
在您的视图中,只有一个ListView,或者只是一个绑定到该集合的ItemsControl,以及一个将ButtonViewModel转换为按钮的DataTemplate。
当用户点击“添加”按钮时,将新的ButtonViewModel添加到您的集合中,视图将自动更新以匹配。
答案 4 :(得分:0)
首先,让我们为一行创建一个视图模型。在该模型中,您将拥有3个bool属性,IsButton1Visible,IsButton2Visible,IsButton3Visible或类似的东西,您需要在行上绑定所有属性。 其次,您的方案是,当您单击“添加”时,将添加新行。所以你有一个Row_View_Model列表。在AddCommand上,您将在一个新的Row_View_Model中进入列表。在这里,您可以完全控制要显示的按钮。