2012-04-16 3 views
1

Я использую свет MVVM в сочетании с EF4 и SQL CE 4, но у меня возникают проблемы с моей наблюдаемой коллекцией. Моему приложению не обязательно нужно использовать шаблон mvvm, но поскольку мне нужны преимущества наблюдаемого коллекционирования, я решил научиться его интегрировать. Я могу успешно связать свою базу данных свойств с моим списком и отобразить их, я также могу связать некоторые свойства этих объектов с текстовыми полями, но там, где я застрял, когда я пытаюсь обновить эти свойства, введя текстовое поле. Вот мой XAML код для текстового поля и ListBox:MVVM Light Binding to Observable Collection

<TextBox Text="{Binding SaleTitle, ValidatesOnDataErrors=true, Mode=TwoWay}" 
    <ListBox Height="424" 
     Margin="24,80,0,0"    
     x:Name="listBoxProperties" 
     VerticalAlignment="Top" 
     ItemTemplate="{StaticResource propertySummaryTemplate}" 
     IsSynchronizedWithCurrentItem="True" 
     Width="216" BorderThickness="0" Background="{x:Null}" 
     FontFamily="Segoe UI" 
     ItemsSource="{Binding PropertyList}" 
     SelectedItem="{Binding CurrentProperty, Mode=TwoWay}" 
     ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     UseLayoutRounding="True" 
     HorizontalAlignment="Left" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled" >   
    </ListBox> 

Вот код части моего MainViewModel:

private string _SaleTitle; 
    public string SaleTitle 
    { 
     get 
     { 
      if (CurrentProperty != null) 
       return CurrentProperty.SaleTitle; 
      else 
       return ""; 
     } 
     set 
     { 
      _SaleTitle = value; 
      RaisePropertyChanged("SaleTitle"); 
     } 
    } 



       private RelayCommand loadCommand; 
    public ICommand LoadCommand 
    { 
     get 
     { 
      if (loadCommand == null) 
       loadCommand = new RelayCommand(() => Load()); 
      return loadCommand; 
     } 
    } 
    private void Load() 
    { 
     PropertyList = new ObservableCollection<Property>((from property in entities.Properties.Include("Images") 
                  select property)); 
     propertyView = CollectionViewSource.GetDefaultView(PropertyList); 
     if (propertyView != null) 
      propertyView.CurrentChanged += new System.EventHandler(propertyView_CurrentChanged); 
     RaisePropertyChanged("CurrentContact"); 
     RaisePropertyChanged("SaleTitle"); 
     RaisePropertyChanged("Address"); 
     RaisePropertyChanged("AuctioneerName"); 
     RaisePropertyChanged("AgentName"); 
     RaisePropertyChanged("Price"); 
     RaisePropertyChanged("NextBid"); 
     RaisePropertyChanged("Status"); 
    } 


     void propertyView_CurrentChanged(object sender, System.EventArgs e) 
    { 
     RaisePropertyChanged("CurrentContact"); 
     RaisePropertyChanged("SaleTitle"); 
     RaisePropertyChanged("Address"); 
     RaisePropertyChanged("AuctioneerName"); 
     RaisePropertyChanged("AgentName"); 
     RaisePropertyChanged("Price"); 
     RaisePropertyChanged("NextBid"); 
     RaisePropertyChanged("Status"); 
    } 

    private Property _CurrentProperty; 
    public Property CurrentProperty 
    { 
     get 
     { 
      if (propertyView != null) 
       return propertyView.CurrentItem as Property; 
      return null; 
     } 

     set 
     { 
      _CurrentProperty = value; 
      RaisePropertyChanged("CurrentProperty"); 
     } 
    } 


    public ObservableCollection<Property> PropertyList 
    { 
     get 
     { 
      return propertyList; 
     } 

     set 
     { 
      if (propertyList == value) 
      { 
       return; 
      } 

      var oldValue = propertyList; 
      propertyList = value; 

      // Update bindings, no broadcast 
      RaisePropertyChanged(PropertiesPropertyName); 
     } 
    } 

    public MainViewModel() 
    { 
     if (IsInDesignMode) 
     { 
      // Code runs in Blend --> create design time data. 
     } 
     else 
     { 
      // Code runs "for real" 
      entities = new Model1Container1(); 
     } 
    } 

    ////public override void Cleanup() 
    ////{ 
    //// // Clean up if needed 

    //// base.Cleanup(); 
    ////} 
} 

}

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

ответ

2

Посмотрите на свое определение свойства SaleTitle. Он считывает значение из CurrentProperty.Saletitle, но устанавливает значение в локальное поле, которое не используется в любом случае.

+0

Клянусь, я попробовал это, не могу поверить, что это было так просто - должен быть мой ум, играющий в трюки через 10 часов подряд! – randomalbumtitle