我TextBlock
在我的 WPF/MVVM(带有 MVVM Light 框架)游戏中有一个绑定到应该反映就业工人数量的属性。我已确认绑定完好无损,但无法更新。
这是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; }
}
同样在我的视图模型中,更改 aWorker
的 Employer 属性的命令:
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 的 Employer 属性正在正确更新,但我没有尝试过任何TextBlock
更新。我已经尝试实施RaisePropertyChanged
我在这里列出的所有内容,但没有运气。
如果我在初始化数据时将 a 的就业属性设置为Worker
构造函数中的正确公会,则TextBlock
显示中的数字会正确显示,但之后不会更新。我的直觉是Workers
属性中的 LINQ 过滤和扩展方法导致了这个问题,但我可能错了。
如果有人对如何使它起作用有任何想法,我很想听听他们的意见。任何关于此事的建议将不胜感激。如果您需要更多代码或信息,请询问。
谢谢。
更新:我认为 Ron 是在正确的道路上;扩展方法可能会破坏绑定。如果是这种情况,有人可以就如何在Guild
不破坏绑定的情况下过滤 Workers 属性给我任何建议吗?此外,就 setter 问题而言,我向 Workers 属性添加了一个 setter,但它从未真正触发过。