【发布时间】:2016-04-13 08:22:26
【问题描述】:
这是完整的Sample code
使用 MVVM 模式我的要求是有一个 ListView
-
如果用户在 ListView 内点击复选框 Storyboard Animation 应播放
TrueFalse并且 ListView 绑定值应在数据库中更新。对于 true,刻度应该弹出动画,对于 false,刻度应该通过动画变得不可见。
已解决根据@Elvis Xia 回答
- 如果用户点击 ListviewItem 导航到具有值的新页面
- Blueprint
现在我开始为数据模板创建用户控件。在这里,我想分别识别这两个事件,用户分别单击 checkbox 或单击 Item。
使用 ICommand 我正在创建两个委托,它们绑定到两个透明按钮,该按钮中继被点击的事件。
创建透明按钮并在绑定它们的同时创建委托让我确信肯定有更好的方法可以利用 MVVM 来处理这些事件,而无需任何代码。
用户控件 XAML
<Button Background="LightBlue" BorderBrush="White" BorderThickness="4" Command="{x:Bind sampleItem.itemTapped}" CommandParameter="{Binding}" HorizontalContentAlignment="Stretch">
<Grid Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Margin="20" HorizontalAlignment="Center" Text="{x:Bind sampleItem.sampleText}" FontSize="30"/>
<Image Grid.Column="1" Height="60" Width="60" Source="ms-appx:///Assets/check_off.png" HorizontalAlignment="Right"/>
<Image x:Name="image" Grid.Column="1" Height="60" Width="60" Source="ms-appx:///Assets/check_on.png" HorizontalAlignment="Right" Visibility="Collapsed" RenderTransformOrigin="0.5,0.5">
<Image.RenderTransform>
<CompositeTransform/>
</Image.RenderTransform>
</Image>
<Button x:Name="btnFav" Grid.Column="1" Height="60" Width="60" HorizontalAlignment="Right" Background="Transparent" Command="{x:Bind sampleItem.favTapped}" CommandParameter="{Binding}">
<Interactivity:Interaction.Behaviors>
<!--<Core:EventTriggerBehavior EventName="Tapped">
<Core:InvokeCommandAction Command="{Binding favTapped}" />
</Core:EventTriggerBehavior>-->
<Core:DataTriggerBehavior Binding="{Binding isFav}" Value="true">
<Media:ControlStoryboardAction Storyboard="{StaticResource StoryboardCheckOn}"/>
</Core:DataTriggerBehavior>
<Core:DataTriggerBehavior Binding="{Binding isFav}" Value="false">
<Media:ControlStoryboardAction Storyboard="{StaticResource StoryboardCheckOff}"/>
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Button>
</Grid>
</Button>
UserControl XAML 代码隐藏
MainPageModel sampleItem { get { return this.DataContext as MainPageModel; } }
public MainPageUserControl()
{
this.InitializeComponent();
this.DataContextChanged += (s, e) => this.Bindings.Update();
}
视图模型代码
public async Task GetData()
{
for (int i = 0; i < 10; i++)
{
if (i == 3)
sampleList.Add(new MainPageModel { sampleText = "Selected", isFav = true, favTapped= new DelegateCommand<MainPageModel>(this.OnFavTapped), itemTapped= new DelegateCommand<MainPageModel>(this.OnItemTapped)});
else
sampleList.Add(new MainPageModel { sampleText = "UnSelected"+i.ToString(), isFav = null, favTapped = new DelegateCommand<MainPageModel>(this.OnFavTapped), itemTapped = new DelegateCommand<MainPageModel>(this.OnItemTapped) });
}
}
private void OnFavTapped(MainPageModel arg)
{
if (arg.isFav == null) arg.isFav = true;
else
arg.isFav = !arg.isFav;
}
private void OnItemTapped(MainPageModel arg)
{
System.Diagnostics.Debug.WriteLine("Button Value: "+arg.sampleText);
System.Diagnostics.Debug.WriteLine("Selected Item Value: "+selectedItem.sampleText);
}
MainPage Xaml
<Grid Grid.Row="1">
<ListView ItemsSource="{x:Bind ViewModel.sampleList}" IsItemClickEnabled="True" SelectedItem="{Binding ViewModel.selectedItem,Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<userControls:MainPageUserControl/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
必须有更好的方法来使用后面的代码来达到预期的结果。
【问题讨论】:
-
如果您在 ViewModel 中执行此操作,这是一个很好的方法。是的,你必须执行命令。如果您使用 PRISM,它已经实现了。
-
您使用 DataTriggerBehaviour 播放情节提要的权利。我不明白为什么你必须在 viewmodel 中访问它。
-
我不明白你问题的第二部分。你能详细说明一下吗?
-
如果您想在单击一个按钮时将项目设为选中-> 在视图模型中具有属性。使用 TwoWay 绑定将其绑定到 ListView 的 SelectedItem。单击按钮时,获取按钮的 DataContext 并将其分配给 viewmodel 的 SelectedItem 属性
-
您不必删除 UserControl。使用它,您可以将其绑定到 Viewmodel。如果您对此有任何疑问,请告诉我。现在我不在电脑前。所以我看不到你的样品。但我之前看过它
标签: c# mvvm user-controls win-universal-app windows-10-universal