2016-01-24 62 views
4

概述: 我已經設置了一個INPC屬性,它調用MainViewModel後面的視圖代碼中的頁面導航。此屬性綁定到綁定視圖中列表視圖的SelectedItem屬性。如何調試INPC屬性設置器未觸發?

的INPC實現從執行如下的ViewModelBase類繼承,https://gist.github.com/BrianJVarley/4a0890b678e037296aba

問題:

當我從列表中選擇視圖中的項目,物業SelectedCouncilItem二傳手不會觸發。此屬性綁定到列表視圖的SelectedItem屬性。

調試步驟:

  • 檢查列表視圖屬性,該屬性是一樣的,在MainViewModel屬性名的SelectedItem綁定的名字。
  • 運行解決方案並檢查輸出窗口中是否存在任何綁定錯誤。
  • 在SelectedCouncilItem上放置一個斷點,當我從列表視圖中進行選擇時,該斷點不會被觸發。
  • 檢查視圖的數據上下文設置,驗證該視圖是否設置爲MainViewModel的數據上下文。

問:

有誰知道我可以在調試的問題,還是什麼問題可能是其他步驟?

代碼:

的MainPage - (列表視圖)

<Grid x:Name="ContentPanel" 
      Grid.Row="1" 
      Margin="12,0,12,0"> 
     <phone:LongListSelector x:Name="MainLongListSelector" 
           Margin="0,0,-12,0" 
           ItemsSource="{Binding Items}" 
           SelectedItem="{Binding SelectedCouncilItem}"> 
      <phone:LongListSelector.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="0,0,0,17"> 
         <TextBlock Style="{StaticResource PhoneTextExtraLargeStyle}" 
            Text="{Binding CouncilAcronym}" 
            TextWrapping="Wrap" /> 
         <TextBlock Margin="12,-6,12,0" 
            Style="{StaticResource PhoneTextSubtleStyle}" 
            Text="{Binding CouncilFullName}" 
            TextWrapping="Wrap" /> 
        </StackPanel> 
       </DataTemplate> 
      </phone:LongListSelector.ItemTemplate> 
     </phone:LongListSelector> 
    </Grid> 

MainViewModel - (摘要)

namespace ParkingTagPicker.ViewModels 
{ 
    public class MainViewModel : ViewModelBase 
    { 


     //Dependency Injection private instances 
     private INavigationCallback _navCallBack = null; 

     public MainViewModel() 
     { 
      this.Items = new ObservableCollection<ItemViewModel>(); 

     } 




     /// <summary> 
     /// Creates and adds a few ItemViewModel objects into the Items collection. 
     /// </summary> 
     public void LoadCouncilNamesData() 
     { 
      this.Items.Add(new ItemViewModel() { ID = "6", CouncilAcronym = "WTC", CouncilFullName = "Wicklow Town Council"}); 
      this.Items.Add(new ItemViewModel() { ID = "7", CouncilAcronym = "TS", CouncilFullName = "Tallaght Stadium" }); 
      this.Items.Add(new ItemViewModel() { ID = "8", CouncilAcronym = "GS", CouncilFullName = "Greystones" }); 

      this.IsDataLoaded = true; 
     } 



     public ObservableCollection<ItemViewModel> Items { get; private set; } 

     public bool IsDataLoaded { get; private set; } 

     private ItemViewModel _selectedCouncilItem; 
     public ItemViewModel SelectedCouncilItem 
     {   
      get 
      { 
       return this._selectedCouncilItem; 
      } 
      set 
      { 
       this.SetProperty(ref this._selectedCouncilItem, value,() => this._selectedCouncilItem); 

       if (_selectedCouncilItem != null) 
       { 
        _navCallBack.NavigateTo(_selectedCouncilItem.ID); 
       } 
      } 
     } 


     public INavigationCallback NavigationCallback 
     { 
      get { return _navCallBack; } 
      set { _navCallBack = value; } 
     } 


    } 
} 

ViewModelBase - (詳細INPC實現)

namespace ParkingTagPicker.ViewModels 
{ 
    public abstract class ViewModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) 
     { 
      var propertyChanged = this.PropertyChanged; 

      if (propertyChanged != null) 
      { 
       propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     protected bool SetProperty<T>(ref T backingField, T Value, Expression<Func<T>> propertyExpression) 
     { 
      var changed = !EqualityComparer<T>.Default.Equals(backingField, Value); 

      if (changed) 
      { 
       backingField = Value; 
       this.RaisePropertyChanged(ExtractPropertyName(propertyExpression)); 
      } 

      return changed; 
     } 

     private static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression) 
     { 
      var memberExp = propertyExpression.Body as MemberExpression; 

      if (memberExp == null) 
      { 
       throw new ArgumentException("Expression must be a MemberExpression.", "propertyExpression"); 
      } 

      return memberExp.Member.Name; 
     } 


    } 
} 

回答

3

控件存在問題。請嘗試使用自定義LongListSeletor

public class ExtendedLongListSelector : Microsoft.Phone.Controls.LongListSelector 
{ 
    public ExtendedLongListSelector() 
    { 
     SelectionChanged += LongListSelector_SelectionChanged; 
    } 

    void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     SelectedItem = base.SelectedItem; 
    } 

    public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(LongListSelector), 
          new PropertyMetadata(null, OnSelectedItemChanged)); 

    private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var selector = (LongListSelector)d; 
     selector.SelectedItem = e.NewValue; 
    } 


    public new object SelectedItem 
    { 
     get { return GetValue(SelectedItemProperty); } 
     set { SetValue(SelectedItemProperty, value); } 
    } 
} 

並將其替換爲XAML中的現有List。

xmlns:controls="clr-namespace:ProjectName.FolderName" 

    <controls:ExtendedLongListSelector x:Name="MainLongListSelector" 
           Margin="0,0,-12,0" 
           ItemsSource="{Binding Items}" 
           SelectedItem="{Binding SelectedCouncilItem}"> 
    </controls:ExtendedLongListSelector> 
+0

我試着先添加上面的類,http://hastebin.com/ahudowakop.cs在ctor的名字有一個錯誤,所以改變了。我在類中得到的唯一錯誤是SetSelectedItem聲明它不在LongListSelector中。任何想法是怎麼回事?此外,如何實現這個擴展列表選擇器解決問題中的問題? –

+0

使用SelectedItem =「{Binding SelectedCouncilItem}」。無需調用SetSelectedItem – asitis

+0

,所以我需要從上面的類中刪除此方法?private void SetSelectedItem(DependencyPropertyChangedEventArgs e) { base.SelectedItem = e.NewValue; } –

相關問題