2010-06-30 109 views
0

我有數據綁定的大問題。 我不能綁定數據到兒童控制。我真的是MVVM的新手,我在這個例子中花了很多時間,我不知道這個代碼有什麼問題。數據綁定在mvvm中的問題

小解釋:

我有MainWindow。它有UserControl來顯示todo列表。 我想將我的MyWindow類ParentViewModel設置爲DataContext。 DataContext將TodoItemModelView作爲subdatacontext,它必須是UserControlTodoItems的datacontext。

<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(); 

     } 

我改正了這一點。

我必須添加一個問題: 是否有任何簡單的方法來通知parentmodel,更改複選框在列表框?

這是一個轉換器:

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; } 
    } 
+0

你可以把在轉換方法中設置斷點在你TodoItemStatusConverter,看看它的是否被炒魷魚嗎?也如其他人所說,您應該使用ObserVableCollection 而不是TodoItem []。 – akjoshi 2010-07-01 07:51:56

+0

現在,謝謝Astonish正在工作。我糾正了我的代碼 – user278618 2010-07-01 08:00:28

回答

1

爲什麼你的 「lbTasks」 列表框只是 「{結合}」,而不是「{綁定路徑結合= todoItems}「

我真的在這裏快速瀏覽一下你的代碼..你似乎正確地傳遞了作爲DataContext的todoItemModelView,但從來沒有通知列表框在那裏的數據上下文它會找到它的項目。

你也可以使用一個ObservableCollection在虛擬機列表,以便您可以添加和刪除待辦事項是在某種程度上的GUI可以到

1
<CheckBox IsChecked="{Binding Path=Status, Converter={StaticResource TodoItemStatusConverter}}"/> 

這意味着有反應是在ToDoItemViewModel的屬性稱爲狀態 - 但沒有!重新思考你的ToDoItemVm類是一個toDoItem的封裝(即公共的ToDoItemVm(ToDoItem模型)),並將該數組的數組獲取到PArentVm中(do使用ObservableCollection並將其綁定到列表框。該ParentVm。所以你的列表框結合包括像

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

然後公開該狀態屬性您ToDoItemVm,有類實現INPC,並在二傳手提高的PropertyChanged。

這可能需要一些努力解決它,所以隨時提出更多的問題,你去。轉換器的想法是好的。

HTH,
Berryl

+0

我添加了我的類TodoItem的描述。它具有現場狀態。它現在有什麼意義? :) – user278618 2010-07-01 07:31:02