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;
}
}
}
我試着先添加上面的類,http://hastebin.com/ahudowakop.cs在ctor的名字有一個錯誤,所以改變了。我在類中得到的唯一錯誤是SetSelectedItem聲明它不在LongListSelector中。任何想法是怎麼回事?此外,如何實現這個擴展列表選擇器解決問題中的問題? –
使用SelectedItem =「{Binding SelectedCouncilItem}」。無需調用SetSelectedItem – asitis
,所以我需要從上面的類中刪除此方法?private void SetSelectedItem(DependencyPropertyChangedEventArgs e) { base.SelectedItem = e.NewValue; } –