我有“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,而不是字符串。所以请帮助我,我该怎么做?
答案 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方法。