Создание динамических флажков для списка элементов с помощью mvvm light wpf? - PullRequest
3 голосов
/ 02 июля 2010

У меня есть следующий сценарий:

У меня есть одно окно, скажем MainWindow, где я отображаю список действий в соответствии с конкретным пользователем из базы данных.В окне присутствует одна кнопка.При нажатии на эту кнопку открывается новое окно, содержащее весь список действий из мастер-таблицы.Теперь я хочу добавить чекбокс во втором окне к каждому элементу динамически, чтобы пользователь мог выбрать / отменить выбор действий.Эти выбранные / отмененные значения должны быть сохранены в базе данных, а Parent / MainWindow должен обновляться после нажатия кнопки «Готово», а изменения должны отражаться в MianWindow.Но я не понимаю, как динамически создавать флажки для каждого элемента списка и связывать их с xaml и устанавливать / снимать флажок.

Просьба предложить с примерами или примерами.

1 Ответ

3 голосов
/ 02 июля 2010

Вы можете настроить элемент списка, используя ListView's ItemTemplate . Добавить флажок и текстовый блок на панель, которая будет представлять собой вашу табличку с данными.

Обновление

Модель:

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

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

}

Модель представления для ListViewItem во втором окне:

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:

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>
...