【发布时间】:2013-07-05 18:27:47
【问题描述】:
我有一个带有属性的模型:
/// <summary>
/// List of available map modes
/// </summary>
public Array MapModes { get; private set; }
/// <summary>
/// The current cartographic mode of the map
/// </summary>
public MapCartographicMode MapMode
{
get { return _mapMode; }
set
{
if (value == _mapMode) return;
_mapMode = value;
OnPropertyChanged();
}
}
/// <summary>
/// List of available map color modes
/// </summary>
public Array MapColorModes { get; private set; }
//The current color mode of the map
public MapColorMode MapColorMode
{
get { return _mapColorMode; }
set
{
if (value == _mapColorMode) return;
_mapColorMode = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
我的 XAML 看起来像这样:
<maps:Map x:Name="MainMap"
Height="{Binding MapHeight}"
ColorMode="{Binding MapColorMode, Converter={StaticResource MapTestConverter}}">
属性在另一个页面上更新。
<toolkit:ListPicker Header="Map mode"
ItemsSource="{Binding MapModes}"
SelectedItem="{Binding Path=MapMode, Mode=TwoWay}"/>
<toolkit:ListPicker Header="Map color mode"
ItemsSource="{Binding MapColorModes}"
SelectedItem="{Binding Path=MapColorMode, Mode=TwoWay}"/>
现在 ListPickers 的绑定工作正常,模型中的值始终代表上次在这里选择的内容。
Map 绑定也有效,它获取初始值并在我第一次更改属性时更新。
但就是这样。在第一次属性更改后,它拒绝更新。 (不调用虚拟 IValueConverter)。
模型仍然很好地引发了属性更改事件,并且该属性在模型中具有正确的值(例如在页面加载时手动分配它可以完美地工作)
由于绑定似乎正在“损坏”,因此我尝试在每次更新属性时重新创建它
Binding b = new Binding("MapMode");
BindingOperations.SetBinding(MainMap, Map.CartographicModeProperty, b);
这行得通。我开始认为 wp8 地图实现中存在错误或某些东西。 (或者我可能会错过一些完全明显的东西^^)
【问题讨论】:
-
你能展示你的 OnPropertyChanged() 方法吗?通常,当您提出该方法时,您会将公共属性名称传递给该方法
-
我更新了它,我用调试器检查了它,它使用了正确的名称。
-
你有什么改变数据上下文的东西吗?
-
据我所知,除了后面代码中的显式 DataContext = ... 之外,还能做什么?有趣的是,在调试 OnPropertyChanged() 时,我注意到处理程序变量的“InvocationCount”属性在第一次更新后减少了 1。所以它似乎真的从数据绑定中移除了自己 oO
-
它也只有在成功更新时才会这样做。例如,将 Road 更改为 Terrain 时,将 Light 更改为 Dark 后,这会失败(现在不知道为什么)-> 地图上没有变化。但是 InvocationCount 并没有减少。然后,如果我将其更改为例如天线,它会起作用,地图更新和 InvocationCount 会减少。并且没有进一步的更新将起作用
标签: c# xaml data-binding windows-phone-8