Проблема с привязкой данных в mvvm - PullRequest
0 голосов
/ 01 июля 2010

У меня большая проблема с привязкой данных. Я не могу связать данные с детьми. Я действительно новичок в MVVM, и я провожу много часов в этом примере, и я понятия не имею, что не так с этим Кодексом.

Маленькое объяснение:

У меня есть MainWindow. Он имеет UserControl для отображения списка задач. Я хочу установить мой класс MyWindow ParentViewModel как DataContext. DataContext имеет TodoItemModelView как subdatacontext, который должен быть datacontext из UserControlTodoItems.

<Window x:Class="Repo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Repo="clr-namespace:Repo" Title="Window1" Height="300" Width="300">
    <Window.Resources>

        <Repo:ParentViewModel x:Key="parentVM"/>

    </Window.Resources>

    <Window.DataContext>
        <StaticResourceExtension ResourceKey="parentVM"/>
    </Window.DataContext>
    <Grid>
           <Repo:UserControlTodoItems DataContext="{Binding Path=todoItemModelView}">

           </Repo:UserControlTodoItems>
                      </Grid>
</Window>

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
     }



 class ParentViewModel
        {
            public TodoItemModelView todoItemModelView { get; set; } 
            public ParentViewModel()
            {
               this.todoItemModelView=new TodoItemModelView();
            }
        }


public class TodoItemModelView
{
    public ObservableCollection<TodoItem> todoItems { get; set; }

    public TodoItemModelView()
    {
        ObservableCollection<TodoItem> loadedTodoItems = new ObservableCollection<TodoItem>();
        loadedTodoItems.Add(new TodoItem() { Code = "10", ObjectCode = "DE", ObjectType = ObjectType.Country, Status = TodoItemStatus.InProgress, Type = TodoItemType.CollectPhotos });
        loadedTodoItems.Add(new TodoItem() { Code = "11", ObjectCode = "DE", ObjectType = ObjectType.Country, Status = TodoItemStatus.Todo, Type = TodoItemType.DescribeOjbect });
        loadedTodoItems.Add(new TodoItem() { Code = "12", ObjectCode = "DE", ObjectType = ObjectType.Country, Status = TodoItemStatus.Accomplshed, Type = TodoItemType.CollectVideos });
        todoItems = loadedTodoItems;
    }
}

<UserControl x:Class="Repo.UserControlTodoItems"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Repo="clr-namespace:Repo" Height="auto" Width="auto">
    <UserControl.Resources>
        <Repo:TodoItemStatusConverter x:Key="TodoItemStatusConverter"/>

    </UserControl.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Path=todoItems}" Name="lbTasks"> 
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=Status, Converter={StaticResource TodoItemStatusConverter}}"/>
                        <TextBlock Text="{Binding Path=Type}" />
            </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>
</UserControl>


public UserControlTodoItems()
        {
            InitializeComponent();

        }

Я исправляю это.

Я должен добавить один вопрос: Есть ли простой способ сообщить родительской модели, флажок изменения в списке?

это конвертер:

public class TodoItemStatusConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

            TodoItemStatus todoItemStatus = (TodoItemStatus)value;


            if (todoItemStatus == TodoItemStatus.Accomplshed)
            {
                return true;
            }
            else
            {
                return false;
            }



        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
           if ((bool) value)
            {
                return TodoItemStatus.Accomplshed;
            }
            else
            {
                return TodoItemStatus.InProgress;
            }

        }

Это класс TodoItem:

public class TodoItem
    {
        public TodoItemType Type { get; set; }

        public TodoItemStatus Status { get; set; }

        public string Code { get; set; }

        public string ObjectCode { get; set; }

        public ObjectType ObjectType { get; set; }
    }

Ответы [ 2 ]

1 голос
/ 01 июля 2010
<CheckBox IsChecked="{Binding Path=Status, Converter={StaticResource TodoItemStatusConverter}}"/>

Это означает, что в ToDoItemViewModel есть свойство с именем Status, но его нет! Переосмыслите ваш класс ToDoItemVm, чтобы он был просто оболочкой для toDoItem (то есть общедоступного ToDoItemVm (модель ToDoItem), и получите этот массив элементов в PArentVm ( do , используйте ObservableCollection и привяжите его к списку. свойство SelectedToDoItem в ParentVm. Таким образом, ваша привязка для списка содержит что-то вроде

          ItemsSource="{Binding ToDoTems}" 
          IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedToDoItem, Mode=TwoWay}"

Затем предоставьте это свойство Status в вашем ToDoItemVm, попросите класс реализовать INPC и вызвать PropertyChanged в установщике.

Может потребоваться некоторая работа, чтобы разобраться в этом, так что не стесняйтесь задавать больше вопросов по ходу дела. Идея конвертера в порядке.

НТН,
Berryl

1 голос
/ 01 июля 2010

Почему привязка для вашего списка "lbTasks" просто "{Binding}", а не "{Binding Path = todoItems}" *

Я действительно быстро взгляну на ваш код здесь ... выкажется, что todoItemModelView передает как DataContext должным образом, но никогда не информирует список, где в этом контексте данных он найдет свои элементы.

Вы также можете использовать ObservableCollection для списка в ВМ, чтобы вы моглидобавлять и удалять задачи так, чтобы GUI мог отвечать на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...