【发布时间】:2011-03-15 07:13:11
【问题描述】:
我很难在嵌套在另一个使用控件内的用户控件上触发绑定。 这是我的层次结构:
- 导航页
- 用户控件 A (AthleteMaxGrid)
- 用户控件 B (PagingControl)
- 用户控件 A (AthleteMaxGrid)
我将 MVVM 设计模型与 MVVMLight 工具包一起用于这些控件。 情况如下: 两个用户控件都有相应的 ViewModel,它们在 XAML 中附加到它们。 AthleteMaxGrid 的视图模型有一个公开的 Observable Collection (AthleteMaxes) 属性,我想将其绑定到 PagingControl。此属性也绑定到 AthleteMaxGrid 控件的数据视图中,因此它知道它已正确填充。
代码如下:
AthleteMaxGrid XAML:
<UserControl ...
DataContext="{Binding AthleteMaxGrid, Source={StaticResource Locator}}">
....
<StackPanel Orientation="Horizontal">
...
<my:PagingControl Jake="{Binding AthleteMaxes}" />
</StackPanel>
<telerik:RadGridView x:Name="rgvMaxes" IsScrolling="False"
ItemsSource="{Binding AthleteMaxes}" AutoGenerateColumns="False"
IsBusy="{Binding IsBusy}" >...
这是来自 AthleteMaxGrid ViewModel 的片段:
public const string AllMaxesPropertyName = "AthleteMaxes";
private ObservableCollection<AthleteMaxTableItem> _allMaxes = new ObservableCollection<AthleteMaxTableItem>();
/// <summary>
/// Gets the AthleteMaxes property.
/// </summary>
public ObservableCollection<AthleteMaxTableItem> AthleteMaxes
{
get
{
return _allMaxes;
}
set
{
if (_allMaxes == value)
{
return;
}
_allMaxes = value;
// Update bindings, no broadcast
RaisePropertyChanged("AthleteMaxes");
}
}
这是来自 PagingControl 的 XAML:
<UserControl ...
x:Name="rootElement"
DataContext="{Binding PagingControlVM, Source={StaticResource Locator}}">
...
</UserControl>
我在后面的 PagingControl 代码中创建了 Dependency 属性,如下所示:
public const string JakePropertyName = "Jake";
public object Jake
{
get
{
return (object)GetValue(JakeProperty);
}
set
{
SetValue(JakeProperty, value);
}
}
public static readonly DependencyProperty JakeProperty = DependencyProperty.Register(
JakePropertyName,
typeof(object),
typeof(PagingControl),
new PropertyMetadata(null,
new PropertyChangedCallback(onJakeChanged)));
private static void onJakeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show(d.GetType().ToString());
}
此时我只是试图让我的回调函数命中 (onJakeChanged),所以我知道数据正确进入,我可以进入绑定控件的下一阶段,但是它没有被命中。
如果我在 AthleteMaxGrid 上的 XAML 中将 Jake 属性设置为简单的“测试”,那么回调就会正确命中。好像是viewModel属性绑定的问题。
有什么想法吗?
提前致谢! 尼克
【问题讨论】:
-
每当我遇到绑定问题时,我都会添加大量带有各种调试绑定的 TextBlock,以查看属性是什么。因此,带有 Text="{Binding}" 的 TextBlock 将确保您实际绑定到某些东西,并告诉您绑定到什么类型(因此您可以检查 AthleteMaxes 属性是否确实存在于该类型上。Text=" {Binding AthleteMaxes}" 会告诉你该属性是否为空。
-
好主意。我以前从未尝试过,而且我肯定对解决绑定问题的困难感到沮丧。我会试一试。谢谢!
标签: data-binding silverlight-4.0