我搜索了一下,但我发现的信息并不是我需要的。所以我决定问你们所有人 - 我确定这是一个新手问题,但我真的不明白。 开始吧: 我有一个DataSource,它是一个分组的可观察集合。目前我有两组不同的项目。这两个组和项目属于同一个共同基础:
public DataCommon(String uniqueId, String title, String subtitle, String imagePath, String description)
{
this._uniqueId = uniqueId;
this._title = title;
this._subtitle = subtitle;
this._description = description;
this._imagePath = imagePath;
}
这是模型的构造函数。 在ViewModel中我填写它。 现在我想将ItemClick与Command绑定到我的ViewModel。我喜欢这个(只有很短的一部分):
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Grouped Items"
Grid.RowSpan="2"
Padding="116,137,40,46"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
SelectionMode="None"
IsSwipeEnabled="false"
IsItemClickEnabled="True"
>
<WinRtBehaviors:Interaction.Behaviors>
<Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding UniqueId}"/>
</WinRtBehaviors:Interaction.Behaviors>
但是现在出了问题。在“Binding UniqueId”中,它说DataContext是我的ViewModel,所以我无法将它连接到Model的属性。看着Page.DataContext我告诉XAML tu使用我的ViewModel作为DataContext。我想这是对的。但是如何访问Model-properties呢? 我试图这样做(将我的模型定义为DataModel):
<WinRtBehaviors:Interaction.Behaviors>
<Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding DataModel:SampleDataCommon.UniqueId}"/>
</WinRtBehaviors:Interaction.Behaviors>
但正如我之前猜测的那样它不起作用 - 因为参数我得到了null。
我会感谢任何帮助,因为正如我在帖子开头说的那样:我真的不明白......
答案 0 :(得分:0)
您不能以这种方式使用EventToCommandBehavior
- 其作者也在comments中说明了这一点。
在这种情况下,我使用以下附加属性:
public static class ItemClickBehavior
{
public static DependencyProperty ItemClickCommandProperty = DependencyProperty.RegisterAttached("ItemClickCommand",
typeof(ICommand),
typeof(ItemClickBehavior),
new PropertyMetadata(null, OnItemClickCommandChanged));
public static void SetItemClickCommand(DependencyObject target, ICommand value)
{
target.SetValue(ItemClickCommandProperty, value);
}
public static ICommand GetItemClickCommand(DependencyObject target)
{
return (ICommand)target.GetValue(ItemClickCommandProperty);
}
private static void OnItemClickCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
var element = target as ListViewBase;
if (element != null)
{
// If we're putting in a new command and there wasn't one already
// hook the event
if ((e.NewValue != null) && (e.OldValue == null))
{
element.ItemClick += OnItemClick;
}
// If we're clearing the command and it wasn't already null
// unhook the event
else if ((e.NewValue == null) && (e.OldValue != null))
{
element.ItemClick -= OnItemClick;
}
}
}
static void OnItemClick(object sender, ItemClickEventArgs e)
{
GetItemClickCommand(sender as ListViewBase).Execute(e.ClickedItem);
}
}
这是将命令绑定到它的方式:
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Grouped Items"
Grid.RowSpan="2"
Padding="116,137,40,46"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
SelectionMode="None"
IsSwipeEnabled="false"
IsItemClickEnabled="True"
itbmb:ItemClickBehavior.ItemClickCommand="{Binding ItemClickCommand}"
>
我想如果您真的想要从附加属性创建行为并不是那么困难。