如何向上发送数据?从Datatemplate到上面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何向上发送数据?从Datatemplate到上面相关的知识,希望对你有一定的参考价值。

所以当用户点击+和 - 图像按钮时,我得到了这个页面,TotalPrice标签绑定得到更新,没问题。这是项目模板绑定。但是,我需要每当产品增加或减少时,我需要更新TotalOrderValue。但是当listview中的某些东西得到更新时,我无法触发UpdateTotalOrderValue。我该怎么做呢?

我尝试了一些事件,但无法让它们工作,因为它无法向上传达。

这是来自PAGE视图模型的

public decimal? TotalOrderValue
{
    get { return totalOrderValue; }
    set
    {
        totalOrderValue = value;
        OnPropertyChanged();
    }
}

private void UpdateTotalOrderValue()
{
    foreach (var product in Items)
    {
        TotalOrderValue += product.Price;
    }
}

这是listview绑定的ProductModel / DataTemplate你可以在这里查看我想要做的评论。

public int ModelUpdateCount
{
    get { return modelUpdateCount; }
    set
    {
        if (value >= 0)
        {
            modelUpdateCount = value;
            TotalPrice = modelUpdateCount * Price;
            //ProductsPageViewModel.UpdateTotalOrderValu();
            NotifyPropertyChanged();
        }
    }
}

public decimal? TotalPrice
{
    get { return totalPrice; }
    set
    {
        totalPrice = value;
        NotifyPropertyChanged();
    }
}

这是页面本身

<Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Padding="0,0,0,0" RowSpacing="5" ColumnSpacing="0">
    <Grid.RowDefinitions>
        <RowDefinition Height="60" />
        <RowDefinition Height="60" />
        <RowDefinition Height="*" />
        <RowDefinition Height="120" />
        <RowDefinition Height="60" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.1*" />
        <ColumnDefinition Width="0.1*"/>
        <ColumnDefinition Width="0.15*"/>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.1*"/>
        <ColumnDefinition Width="0.1*"/>
        <ColumnDefinition Width="0.1*"/>
        <ColumnDefinition Width="0.2*"/>
        <ColumnDefinition Width="0.1*"/>
    </Grid.ColumnDefinitions>

    <!--TOP LABELS-->


    <!--LIST OF PRODUCTS IN THE SCROLLVIEW-->

    <Label  Margin="5" Grid.Row="1" Grid.Column="0" BackgroundColor="LightGray" HorizontalOptions="Fill"  Text="IMAGE" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="1" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="ARTICLE" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="2" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="EAN NUMBER" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="3" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="DESCRIPTION" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="4" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="SIZE" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="5" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="SRP" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="6" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="PRIZE" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="7" BackgroundColor="LightGray" HorizontalOptions="Fill"  Text="QUANTITY" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />
    <Label  Margin="5" Grid.Row="1" Grid.Column="8" BackgroundColor="LightGray" HorizontalOptions="Fill" Text="TOTAL" Style="{StaticResource PanelText}" TextColor="Black" FontSize="20" VerticalOptions="Fill" />


    <ListView x:Name="lvItemsList"
          ItemsSource="{Binding GroupedItems}"
          IsGroupingEnabled="True"
          GroupDisplayBinding="{Binding Key}"
          GroupShortNameBinding="{Binding Key}"
          HasUnevenRows="True"
          Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="9" HorizontalOptions="FillAndExpand" Margin="5"
        >
        <ListView.GroupHeaderTemplate>
            <DataTemplate>
                <ViewCell Height="30">
                    <Frame BorderColor="Gray" Padding="5">
                        <Label Text="{Binding Key}" TextColor="Black" Font="Large" VerticalTextAlignment="Center" VerticalOptions="Center"/>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.GroupHeaderTemplate>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell Height="60">
                    <Grid FlexLayout.Basis="100%" HeightRequest="60"  Margin="5" RowSpacing="5" ColumnSpacing="10" HorizontalOptions="FillAndExpand">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.1*" />
                            <ColumnDefinition Width="0.1*"/>
                            <ColumnDefinition Width="0.15*"/>
                            <ColumnDefinition Width="0.3*"/>
                            <ColumnDefinition Width="0.1*"/>
                            <ColumnDefinition Width="0.1*"/>
                            <ColumnDefinition Width="0.1*"/>
                            <ColumnDefinition Width="0.2*"/>
                            <ColumnDefinition Width="0.1*"/>
                        </Grid.ColumnDefinitions>


                        <ffimageloading:CachedImage  
                                Source="{Binding LocalImagePath}" HorizontalOptions="StartAndExpand" VerticalOptions="CenterAndExpand" Aspect="AspectFill"
                                DownsampleToViewSize="true"
                            DownsampleHeight="180"
                            DownsampleWidth="120"
                            >

                            <ffimageloading:CachedImage.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding Path=ViewModel.CmdImageTapped, Source={x:Reference Products}}"
                                                          CommandParameter="{Binding .}"
                                                          NumberOfTapsRequired="1"/>
                            </ffimageloading:CachedImage.GestureRecognizers>
                        </ffimageloading:CachedImage>

                        <Label VerticalOptions="CenterAndExpand"  Grid.Column="1"  Text="{Binding SkuNumber}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Start" TextColor="Black"/>

                        <Label VerticalOptions="CenterAndExpand"  Grid.Column="2"  Text="{Binding Ean13}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Center" TextColor="Black"/>

                        <Label  VerticalOptions="CenterAndExpand"  Grid.Column="3"  Text="{Binding ProductName}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Start" TextColor="Black" FontAttributes="Bold" />

                        <Label  VerticalOptions="CenterAndExpand"  Grid.Column="4"  Text="{Binding Size}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Center" TextColor="Black"/>

                        <Label HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand"  Grid.Column="5"  Text="{Binding SalesRecommendedPrice}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Center" TextColor="Black"/>

                        <Label HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand"  Grid.Column="6"  Text="{Binding PriceWithUnit}" Style="{StaticResource PanelText}" HorizontalTextAlignment="Center" TextColor="Black" FontAttributes="Bold"/>

                        <Grid VerticalOptions="CenterAndExpand" Grid.Column="7">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Button Image="line_in_square.png" BackgroundColor="White" HorizontalOptions="Start" VerticalOptions="Start" Command="{Binding DeCrementCommand}" />
                            <Frame Grid.Column="1" BorderColor="Gray" HorizontalOptions="Fill" VerticalOptions="Center" Padding="8"  >
                                <Label Text="{Binding ModelUpdateCount, StringFormat='{0}'}" FontSize="16" TextColor="Black" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                            </Frame>
                            <Button BackgroundColor="White" Grid.Column="2" Image="plus_sign.png" HorizontalOptions="End" VerticalOptions="Start" Command="{Binding IncrementCommand}" />
                        </Grid>
                        <Label  VerticalOptions="CenterAndExpand" Grid.Column="8" Text="{Binding TotalPrice, StringFormat='{0:C2}'}" Style="{StaticResource PanelText}" FontAttributes="Bold" TextColor="Black"/>

                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

    <!-- Bottom Command Bar -->
    <Grid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="9" BackgroundColor="LightGray"  VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Padding="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="120"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="360"/>
        </Grid.ColumnDefinitions>

        <Label Text="COMMENTS&#x0a;/ PO NUMBER:" BackgroundColor="LightGray" VerticalOptions="Center" HorizontalOptions="Center" TextColor="Black" />

        <Editor BackgroundColor="White" TextColor="Black" Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"  VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Margin="10,10,10,10" />

        <Label Grid.Row="0" Grid.Column="2" VerticalOptions="End" HorizontalOptions="End" Text="£ 221212" Margin="0,0,20,0" FontSize="16"/>
        <Label Grid.Row="0" Grid.Column="2" VerticalOptions="Center" HorizontalOptions="Start" FontSize="40" Text="{Binding TotalOrderValue}" Margin="35,0,0,0"/>

        <Button  Text="SUBMIT PART ORDER"  Command="{Binding SubmitOrderCommand}" BackgroundColor="#088da5" FontAttributes="Bold" TextColor="White" Grid.Row="1" Grid.Column="2"  VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Margin="0,0,20,10"/>

如果需要,可视图像:

https://gyazo.com/80f64e4146b6a661f983938d1fb5d1bf

需要更新的0才是listview中所有产品的总和。

答案

我的建议是在PageViewModel中从ProductModel添加一个PropertyChanged事件的监听器:

public void AttachListener()
{
   foreach (var product in Items)
   {
      production.PropertyChanged += OnOrderCountUpdate;
   }
}

private void OnOrderCountUpdate(object sender, PropertyChangedEventArgs e)
{
   if(e.PropertyName == "ModelUpdateCount")
       UpdateTotalOrderValue();
}

您应该在页面的OnAppearing()中附加侦听器,并在OnDisappearing()中将其删除

另一答案

您可以像这样创建一个新类DataSource

public class PageVMDataSource
{
    #region Attributes

    private readonly PageVM pageVM;
    private readonly ProductModel productModel;

    #endregion

    #region Public Methods


    public PageVMDataSource(PageVM pageVM, ProductModel productModel)
    {
        this.pageVM = pageVM;
        this.productModel= productModel;
    }


    public void Initialize()
    {
        this.productModel.PropertyChanged += this.OnProductModelPropertyChanged;
    }

    #endregion

    #region Event Handlers

    private void OnProductModelPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        switch (propertyChangedEventArgs.PropertyName)
        {
            case "ModelUpdateCount":
                this.pageVM.UpdateTotalOrderValue;
                break;
        }
    }

    #endregion
}

创建VM和模型时,请创建此DataSource的新实例,以便订阅模型更改并执行VM方法。

通过这样做,您正在应用SOLID,您可以控制所有需要“通信”的东西

以上是关于如何向上发送数据?从Datatemplate到上面的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ObservableCollection 绑定到 DataTemplate 中的文本框?

从 DataTemplate 访问父 DataContext

从 DataTemplate 中绑定到 TabItem 标头

我可以从 UserControl 绑定到 DataTemplate 吗?

UWP 数据绑定:如何将按钮命令设置为 DataTemplate 中的父 DataContext

在后面的代码中创建 DataTemplate