我在我的WPF/MVVM(帶MVVM Light框架)遊戲中綁定了一個TextBlock
遊戲,該遊戲綁定到一個屬性,該屬性應該反映僱用員工的數量。我已確認綁定完好無損,但無法更新。WPF中的綁定屬性不更新
這裏是在我看來,TextBlock
:
<TextBlock x:Name="WorkersTextBlock"
FontFamily="Pericles"
DataContext="{Binding Guilds[0]}"
Text="{Binding Workers.Count,
StringFormat=Workers : {0},
FallbackValue=Workers : 99}" />
在我的視圖模型屬性:
public ObservableCollection<Guild> Guilds
{
get { return DataManager.Data.Guilds; }
}
而且在我的視圖模型,該命令更改Worker
的僱主財產:
private void ExecuteHireWorkerCommand()
{
if (SelectedWorker == null)
return;
SelectedWorker.Employer = DataManager.Data.Guilds[0];
Gold -= SelectedWorker.Salary;
_workerCollectionView.Refresh();
}
在DataManager中,它是一個包含我所有數據的單例類:
private ObservableCollection<Guild> _guilds = new ObservableCollection<Guild>();
public ObservableCollection<Guild> Guilds
{
get { return _guilds; }
}
private ObservableCollection<Worker> _workers = new ObservableCollection<Worker>();
public ObservableCollection<Worker> Workers
{
get { return _workers; }
}
在Guild
模式:
public ObservableCollection<Worker> Workers
{
get { return DataManager.Data.Workers.Where(w => w.Employer == this).ToObservableCollection(); }
}
在Worker
僱主屬性是:
public Guild Employer { get; set; }
而在去年,我的擴展方法(我認爲這是問題的根源):
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
消息框確認通過命令Worker
s「僱主」屬性正在更新,但我沒有試過任何東西使得TextBlock
更新。我已經嘗試在我在這裏列出的一切都沒有運氣的情況下實施RaisePropertyChanged
。
如果我在初始化數據時將構造函數中的Worker
的Employment屬性設置爲正確的公會,則TextBlock
中的數字將正確顯示,但在此之後不會更新。我的直覺是Workers
屬性中的LINQ過濾和擴展方法導致了這個麻煩,但我可能是錯的。
如果任何人有任何想法如何使這個工作,我很樂意聽到他們。任何有關此事的建議都將不勝感激。如果您需要更多的代碼或信息,請詢問。
謝謝。
更新:我認爲羅恩是在正確的道路上;擴展方法可能會破壞綁定。如果是這樣的話,任何人都可以給我任何建議,如何在不破壞綁定的情況下過濾Guild
中的Workers屬性?另外,就setter問題而言,我向Workers屬性添加了一個setter,但它實際上從未實際觸發。
這個神奇的可能是「我已經嘗試在我沒有運氣列出的所有事情上實現RaisePropertyChanged」向我們展示該代碼。我的猜測是你在那裏犯了一些錯誤。 –
我用它來通知:http://kindofmagic.codeplex.com/這很難搞砸了,它完美適用於其他屬性。 –
我幾乎沒有見過更糟糕的命名屬性。它應該被稱爲NotifiesWhenPropertyChangesAttribute。魔術可以是任何東西。 –