动态控制WPF中的按钮数量

时间:2012-01-12 09:27:51

标签: c# wpf data-binding

我最近和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#中这样做? 其实我甚至不知道,我是以正确的方式吗?

提前致谢。

5 个答案:

答案 0 :(得分:2)

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

也就是说,我会将我的XAML绑定到ObservableCollection<SomeObject>,然后点击AddButton会向SomeObject添加新的ObservableCollection。这将使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>

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中进入列表。在这里,您可以完全控制要显示的按钮。