如何在WPF C#应用程序中动态添加CheckBox

时间:2014-04-10 12:23:26

标签: c# wpf checkbox

我有“gameListView”ListView,我想在其中动态添加Checkbox。那我该怎么办呢?我能够添加字符串,但无法添加Checkbox。我的代码如下。

GridView gridView = new GridView();
gameListView.View = gridView;
//Setting CheckBox here
CheckBox chk = new CheckBox();
chk.IsChecked = varibleName == "1" ? true : false;

gridView.Columns.Add(new GridViewColumn { Header = "Favourite", DisplayMemberBinding = new Binding("Favourite") });
gameListView.Items.Add(new Games.GameItems { GameName = game[0].ToString(), GameDependency = game[1].ToString(), Favourite = chk });

和我的Games.GameItems类如下:

class GameItems
{
    public string GameName { get; set; }
    public string GameDependency { get; set; }
    public System.Windows.Controls.CheckBox Favourite { get; set; }
}

但我的输出显示CheckBox为String :(如下所示 CheckBox

但我想要真正的CheckBox,而不是字符串。所以请帮助我,我该怎么做?

3 个答案:

答案 0 :(得分:3)

您可以为ViewModel创建ListView并将datacontext设置为viewmodel,然后为Collection创建GameItems

public class ListViewModel : INotifyPropertyChanged
{
  // Raise OnPropertyChanged on the setter for game items.. also create backing property
  public ObservableCollection<GameItem> GameItems { get; set; }
}

您可以在XAML

中执行此类绑定
<ListView ItemsSource="{Binding GameItems}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding IsChecked}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
</ListView>

会发生什么情况,它会自动为集合中的每个项目创建CheckBox,除了对业务逻辑进行集中之外,您不必担心任何其他问题。与WPF不同,WinForms不是程序代码。这就是创建XAML的原因。

答案 1 :(得分:0)

您需要为GameItems类定义Datatemplate,例如如下:

<DataTemplate DataType="{x:Type mynamespace:GameItems}">
    <ContentPresenter Content="{Binding Path=Favourite}"/>
</DataTemplate>

但这实际上不是mvvm的想法。相反,您可以将一个布尔属性放入您的gameitems类中,同时使用名称“Favorite”。别忘了使用INotifyPropertyChanged。此类的模板可能如下所示:

<DataTemplate DataType="{x:Type mynamespace:GameItems}">
    <CheckBox IsChecked="{Binding Path=Favourite}"/>
</DataTemplate>

注意:如果可以避免,请不要在模型或视图模型中实例化控件。

答案 2 :(得分:0)

首先,您需要创建一个模型类来绑定数据网格的每一列。

public class Test
    {
        public bool Active  { get; set; }

        public Test()
        {
            Active = false;
        }
    }

然后将以下代码添加到数据网格xaml视图中。

<DataGrid x:Name="gridTest" AutoGenerateColumns="False" Grid.Column="0" HorizontalAlignment="Stretch" Height="254" Margin="15,95,14,0" Grid.Row="0" Grid.RowSpan="1" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="1" ItemsSource="{Binding}" KeyUp="gridTest_KeyUp">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Active">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox x:Name="chkActive" IsChecked="{Binding Active, Mode=TwoWay}" IsEnabled="{Binding IsEditable,Mode=TwoWay}" Margin="16,4,0,0" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

然后将以下代码添加到数据网格的key up事件中。

private void gridTest_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                AddNewRow();
            }
        }

然后,添加以下代码以将可观察集合实例初始化为全局实例。

ObservableCollection<Model.Test> test = new ObservableCollection<Model.Test>(); 

现在,添加以下代码以在网格键向上事件实现的正下方实现AddNewRow方法。

private void AddNewRow()
        {
            test.Add(new Model.Test());
            gridTest.ItemsSource = test;
        }

最后运行应用程序,现在看看你可以动态地向数据网格添加复选框。

注意:也请在initializecomponent之后调用AddNewRow方法。