gpt4 book ai didi

c# - 将值 UserControl 传递给 View Page 的 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:27:06 25 4
gpt4 key购买 nike

这是完整的Sample code
使用 MVVM 模式我的要求是有一个 ListView 在哪里

  • 如果用户在 ListView 内点击复选框 Storyboard动画 应该玩True False并且 ListView 绑定(bind)值应该在数据库中更新。如果为 true,则刻度应以动画形式弹出;对于 false,刻度应在动画中变得不可见。 已解决根据@Elvis Xia 回答
  • 如果用户点击 ListviewItem 导航到具有值
  • 的新页面
  • Blueprint

  • 现在我为数据模板创建了用户控件。在这里,我想分别识别两个事件,用户单击 checkbox或点击 Item分别地。使用 ICommand我正在创建两个绑定(bind)到两个透明按钮的代表,这些按钮中继轻敲事件。创建透明按钮并在绑定(bind)它们时创建委托(delegate)的依赖性让我认为肯定有更好的方法可以利用 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);
    }

    主页 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>

    必须有更好的方法来使用后面的代码来达到预期的结果。

    最佳答案

    public class ViewMOdel()
    {
    public ViewModel()
    {
    favTapped= new DelegateCommand<MainPageModel>(this.OnFavTapped)
    itemTapped= new DelegateCommand<MainPageModel>(this.OnItemTapped)
    }

    public async Task GetData()
    {
    for (int i = 0; i < 10; i++)
    {
    if (i == 3)
    sampleList.Add(new MainPageModel { sampleText = "Selected", isFav = true});
    else
    sampleList.Add(new MainPageModel { sampleText = "UnSelected"+i.ToString(), isFav = null});
    }
    }
    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);
    }
    }

    绑定(bind)应该是这样的
    <Button x:Name="btnFav" Grid.Column="1"  Height="60" Width="60" HorizontalAlignment="Right" Background="Transparent" Command="{Binding ElementName=UserControl, Path=Tag.favTapped}" CommandParameter="{Binding}"/>

    更新
    <ListView  ItemsSource="{x:Bind ViewModel.sampleList}"  x:Name="Listview"IsItemClickEnabled="True" SelectedItem="{Binding ViewModel.selectedItem,Mode=TwoWay}">
    <ListView.ItemTemplate>
    <DataTemplate>
    <userControls:MainPageUserControl Tag="{Binding DataContext,ElementName=Listview}"/>
    </DataTemplate>
    </ListView.ItemTemplate>
    </ListView>
    <Button x:Name="btnFav" Grid.Column="1" Height="60" Width="60" HorizontalAlignment="Right" Background="Transparent" Command="{Binding ElementName=UserControl, Path=Tag.favTapped}" CommandParameter="{Binding}"/>

    Update2 使用 EventTriggerBehavior
     favTapped = new DelegateCommand<RoutedEventArgs>(this.OnFavTapped);

    private void OnFavTapped(RoutedEventArgs arg)
    {
    var item = (( arg.OriginalSource )as Button).DataContext as MainPageModel
    }

    <Button n x:Name="btnFav" Grid.Column="1" Height="60" Width="60" HorizontalAlignment="Right" Background="Transparent" >
    <interact:Interaction.Behaviors>

    <interactcore:EventTriggerBehavior EventName="Click" >
    <interactcore:InvokeCommandAction Command="{Binding ElementName=usercontrol, Path=Tag.favTapped}" />
    </interactcore:EventTriggerBehavior>
    </interact:Interaction.Behaviors>
    </Button>

    关于c# - 将值 UserControl 传递给 View Page 的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592591/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com