【问题标题】:Creating a dynamic checkboxes against the list of items using mvvm light wpf?使用 mvvm light wpf 针对项目列表创建动态复选框?
【发布时间】:2010-07-02 08:56:54
【问题描述】:

我有以下场景:

我有一个窗口说 MainWindow 我根据数据库中的特定用户显示活动列表。窗口上有一个按钮。通过单击该按钮,将打开一个新窗口,其中包含主表中的所有活动列表。现在我想在第二个窗口上动态添加一个复选框,以便用户可以选择/取消选择活动。那些选择/取消选择的值应该保存在数据库中,并且 Parent/MainWindow 在单击完成按钮后应该刷新,并且更改应该反映在 MianWindow 中。但我不知道如何针对每个列表项动态创建复选框并与 xaml 绑定并选择/取消选择复选框。

请提供示例或示例。

谢谢

【问题讨论】:

  • 检查我的更新答案。您可以编辑您的问题,而不是生成实际上不是的答案。

标签: wpf mvvm mvvm-light


【解决方案1】:

您可以使用 ListView 的 ItemTemplate 自定义您的 listviewitem。添加一个复选框 和一个文本块到一个面板,它将构成您的数据模板。

更新

模特:

public class Activity
{         
    public Activity(int id, string name) 
    { 
        ID = id;
        Name = name;        
    } 

    public int ID { get; set; }
    public string Name { get; set; }    

}

第二个窗口中 ListViewItem 的 ViewModel:

public class ActivityViewModel
{
    Activity _model;

    public ActivityViewModel(Activity model, bool isSelected) 
    { 
        _model = model;
        IsSelected = isSelected; 
    }        

    public string Name { get { return _model.Name; } }

    /* Since the view has a checkbox and it requires a bool value for binding
       we create this property */
    public Nullable<bool> IsSelected { get; set; }       
}

数据访问

public class DaoDailyActivities 
{ 
    string activityName = "";  
    bool IsSelected; 

    SqlConnection con = new SqlConnection("server=172.16.32.68;database=ParentalHealth;uid=sa;pwd=Emids123"); 

    public IEnumerable<Activity> GetActivities() 
    {  
        SqlCommand cmd = new SqlCommand("SP_GetActivities", con); 
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open(); /* It is safe to open connections in a try block */

        SqlDataReader readerActivities = cmd.ExecuteReader();
        while (readerActivities.Read()) 
        {           
            yield new Activity(readerActivities["ActivityID"].ToString(), readerActivities["ActivityName"].ToString());            
        } 
    }         
} 

SecondWindow 的 ViewModel:

public class SecondWindowViewModel : ViewModelBase 
{
    DaoDailyActivities _rep = new DaoDailyActivities();

    public ObservableCollection<ActivityViewModel> AllActivities { get; set; }

    public SecondWindowViewModel()
    {
        LoadAllActivities();
    } 

    LoadAllActivities()
    {
        foreach(Activity activity in _rep.GetActivities())
        {
            AllActivities.Add(new ActivityViewModel(activity, (activity.ID % 2 == 0)));
        }
    }
}

XAML:

<ListView ItemsSource="{Binding AllActivities}">
    <ListBox.ItemTemplate>
     <DataTemplate>
       <StackPanel>
         <TextBlock Text="{Binding Path=Name}" />
         <CheckBox IsChecked="{Binding Path=IsSelected}" />
       </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate> 
</ListView>

【讨论】:

  • 感谢您的回复。我已经做到了。值与复选框一起出现。值来自数据库,复选框是动态创建的。现在我想根据表格值预先选择复选框。怎么做。我正在返回列表。谢谢
  • @Tarun:您可以使用转换器-msdn.microsoft.com/en-us/library/… 将值绑定到复选框。向我发送列表数据样本。
  • 您好 Veer,我有一个 MainWindow,其中显示每个特定用户的活动列表。有一个按钮可以在现有列表中添加新活动。通过单击“添加新活动”按钮,将打开一个新窗口,其中包含整个列表以及带有预选复选框的特定用户活动。我想根据数据库值预选值。 MainWindow: Jogging Running 添加新活动窗口: Jogging checkbox Running checkbox Napping Kindly Suggest?
  • @Tarun:如果 Activity 是 ViewModel 而不是 Model,那么您最好添加一个名为 isPresent 的属性。否则,您应该创建一个 ViewModel,它将充当您的模型的其他属性的镜像,并且还包括这个额外的属性 isPresent 以便它可以绑定到复选框。告诉我活动是模型还是包装器。在任何一种情况下,显示一些你的 Activity 类的代码,以便我修改它,你可能会得到更好的图片。还告诉我更多关于新窗口的信息。它是否有一个确定/取消按钮来保存更改?还是在一次单击复选框时保存数据?
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 2014-10-11
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多