我在我的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。魔术可以是任何东西。 –