2011-12-18 18 views
8

मैं बस एमवीवीएम से शुरू कर रहा हूं और एक बाधा उत्पन्न कर दी है जो मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। मैं 2 सूची बॉक्स के साथ एक साधारण दृश्य बनाने की कोशिश कर रहा हूं। पहले सूची बॉक्स का चयन दूसरे सूची बॉक्स को पॉप्युलेट करेगा। मेरे पास एक वर्ग बनाया गया है जो उस जानकारी को संग्रहीत करता है जिसे मैं बांधना चाहता हूं।अवलोकन करने योग्य चयन अद्यतन नहीं कर रहा है

MyObject कक्षा

public class MyObject : ObservableObject 
{ 
    String _name = String.Empty; 
    ObservableCollection<MyObject> _subcategories; 

    public ObservableCollection<MyObject> SubCategories 
    { 
     get { return _subcategories; } 

     set 
     { 
      _subcategories = value; 
      RaisePropertyChanged("SubCategories"); 
     } 
    } 

    public String Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 


    public MyObject() 
    { 
     _subcategories = new ObservableCollection<EMSMenuItem>(); 
    } 
} 

मेरी viewmodel में (प्रत्यक्ष वस्तु सिर्फ एक आधार वर्ग कि INotifyPopertyChanged लागू करता है) मैं मैं दो ObservableCollections बनाया

public ObservableCollection<EMSMenuItem> Level1MenuItems { get; set; } 
public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; } 

ViewModel की मेरी निर्माता में है:

this.Level1MenuItems = new ObservableCollection<EMSMenuItem>(); 
this.Level2MenuItems = new ObservableCollection<EMSMenuItem>(); 
this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml"); 

यह स्तर 1 वस्तुओं के लिए ठीक काम करता है और वे दृश्य में सही ढंग से दिखाते हैं। हालांकि मैं एक कमांड उपयोगकर्ता लिस्टबॉक्स में एक आइटम क्लिक करता है, जो निम्नलिखित कहा जाता हो जाता है कि राशि: किसी कारण से

Level2MenuItems = ClickedItem.SubCategories; 

इस दूसरे लिस्टबॉक्स के यूआई अपडेट नहीं होता। अगर मैं इस स्थान पर ब्रेकपॉइंट डालता हूं तो मैं देख सकता हूं कि Level2MenuItems में इसमें सही जानकारी है। यदि मैं फ़ोरैच लूप लिखता हूं और उन्हें Level2MenuItems संग्रह में अलग-अलग जोड़ता हूं तो यह सही तरीके से प्रदर्शित होता है।

Level2MenuItems = Level1MenuItems[0].SubCategories; 

और वह सही ढंग से अपडेट:

इसके अलावा एक परीक्षण के रूप में मैं निर्माता के लिए निम्न गयी।

तो कोड कन्स्ट्रक्टर में अपेक्षित क्यों काम करेगा, या जब लूपिंग हो रहा है, लेकिन जब कोई उपयोगकर्ता सूची बॉक्स में किसी आइटम पर क्लिक नहीं करता है?

उत्तर

6

आपको Level2MenuItems संपत्ति पर परिवर्तन अधिसूचना बढ़ाने की आवश्यकता है।

इसके बजाय

public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; } 

होने के

आप

private ObservableCollection<EMSMenuItem> _level2MenuItems; 
public ObservableCollection<EMSMenuItem> Level2MenuItems 
{ 
    get { return _level2MenuItems; } 
    set 
    { 
     _level2MenuItems = value; 
     RaisePropertyChanged("Level2MenuItems"); 
    } 
} 

जरूरत कारण निर्माता में पूर्व काम करता है कि बाध्यकारी जगह अभी तक नहीं लिया गया है। हालांकि चूंकि आप एक आदेश निष्पादन के माध्यम से संदर्भ बदल रहे हैं जो बाध्यकारी के बाद होता है, आपको यह बताने की आवश्यकता है कि यह

+0

धन्यवाद। वास्तव में मुझे क्या चाहिए। –

0

आपकी Subcategories संपत्ति should be read-only है।

+0

यह समस्या का समाधान कैसे करता है? – ChrisF

+0

@ChrisF: मुझे संदेह है कि वह संपत्ति स्थापित कर रहा है। – SLaks

1

आपको पर्यवेक्षण चयन के भीतर अपनी पोको कक्षा बनाने की आवश्यकता है IotifyPropertyChanged लागू करें।

उदाहरण:

<viewModels:LocationsViewModel x:Key="viewModel" /> 
. 
. 
.  
<ListView 
    DataContext="{StaticResource viewModel}" 
    ItemsSource="{Binding Locations}" 
    IsItemClickEnabled="True" 
    ItemClick="GroupSection_ItemClick" 
    ContinuumNavigationTransitionInfo.ExitElementContainer="True"> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" Margin="0,0,10,0" Style="{ThemeResource ListViewItemTextBlockStyle}" /> 
       <TextBlock Text="{Binding Latitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="0,0,5,0"/> 
       <TextBlock Text="{Binding Longitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="5,0,0,0" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

public class LocationViewModel : BaseViewModel 
{ 
    ObservableCollection<Location> _locations = new ObservableCollection<Location>(); 
    public ObservableCollection<Location> Locations 
    { 
     get 
     { 
      return _locations; 
     } 
     set 
     { 
      if (_locations != value) 
      { 
       _locations = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 
} 

public class Location : BaseViewModel 
{ 
    int _locationId = 0; 
    public int LocationId 
    { 
     get 
     { 
      return _locationId; 
     } 
     set 
     { 
      if (_locationId != value) 
      { 
       _locationId = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    string _name = null; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    float _latitude = 0; 
    public float Latitude 
    { 
     get 
     { 
      return _latitude; 
     } 
     set 
     { 
      if (_latitude != value) 
      { 
       _latitude = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    float _longitude = 0; 
    public float Longitude 
    { 
     get 
     { 
      return _longitude; 
     } 
     set 
     { 
      if (_longitude != value) 
      { 
       _longitude = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 
} 

public class BaseViewModel : INotifyPropertyChanged 
{ 
    #region Events 
    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion 

    protected void OnNotifyPropertyChanged([CallerMemberName] string memberName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(memberName)); 
     } 
    } 
} 
संबंधित मुद्दे