2014-04-10 156 views
1

我有“gameListView”ListView,我想在其中动态添加复选框。那么我该怎么做?我能够添加字符串,但无法添加复选框。我的代码如下。如何在WPF C#应用程序中动态添加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 Ia类如下

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

但我的输出显示复选框作为字符串:(如下图所示 CheckBox

但我想真正的复选框,不是字符串。所以请帮助我,我该怎么做?

+0

没有必要使用'CheckBox'控件作为属性。通过普通的方式添加复选框xaml/c#,然后将其值绑定为true或false。 –

回答

0

您需要为GameItems类定义一个Datatemplate,例如如下所示:

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

但这实际上不是mvvm的想法。相反,您可以将一个布尔属性放入您的gameitems类中,也可以使用名称'Fav​​orite'。不要忘记使用INotifyPropertyChanged。这个类的模板可能是这样的:

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

注意:如果你可以避免它,你的模型或视图模型中不要instanciate控件。

+0

对不起,我是WPF C#中的新手。所以没有像“mvvm”那样正确地得到你的答案。 CheckBox也是动态的。我可以随时添加或删除该复选框列。 – VarunJi

+0

您可以根据需要添加尽可能多的列,但每列的内容都是类GameItems的一个实例。你必须告诉xaml如何显示这个类。那是什么DataTemplate做。 – SnowballTwo

3

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

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被创建的原因。

+0

你所说的只是关于xaml。但我不能通过代码做到这一点?就像我已经动态添加了字符串。我需要根据条件显示或隐藏Combobox色谱柱。 – VarunJi

+1

@VarunJi'但是我不能通过代码来做这件事吗?' - **否**。 XAML是在WPF中执行UI的**正确**方法。 WPF不是winforms。 –

+0

@VarunJi你可以用'XAML' x1000来做到这一点,而不是你正在尝试做的程序代码。如果你想根据条件显示/隐藏组合框列,你可以使用'DataTriggers'。 –

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> 

然后将下面的代码添加到数据网格的关键事件中。

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

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

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

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

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

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

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

相关问题