【问题标题】:UWP multibinding with ConverterParameter使用 ConverterParameter 进行 UWP 多重绑定
【发布时间】:2016-06-06 17:13:38
【问题描述】:

我有以下 XAML 代码,其中我将一些数据绑定到列表视图。另外,我有非常重要的RecipientConverter,它允许我转换我的 TextBlock。但是,这就是问题所在。此 TextBlock 必须根据以下 TextBlock 中呈现的形式进行转换器(Binding Path=Sum)。 所以,这是我的问题,是否可以将“Sum”TextBlock 作为 ConverterParameter 发送到RecipientConverter?我知道MultipleBinding,但这仅适用于 WPF,在 UWP 中不可用。也许这是用DependencyProperty 实现它的一种方式,但我对此很确定。

注意: “Recipient” TextBlock 和“Sum” TextBlock 是我从服务器获取的动态值。

<ListView x:Name="HistoryList" Padding="10" IsItemClickEnabled="True" Visibility="Collapsed" ItemsSource="{Binding Source={StaticResource TransactionsCVS}}" ItemsPanel="{StaticResource ResourceKey=ItemsPanelTemplate}" ItemClick="HistoryList_ItemClick">
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.HeaderTemplate>
                                <DataTemplate x:DataType="data:TransactionGroupInfo">
                                    <TextBlock FontWeight="Medium" FontSize="16" Foreground="#999999"  Text="{Binding Path=Key}" />
                                </DataTemplate>
                            </GroupStyle.HeaderTemplate>
                        </GroupStyle>
                    </ListView.GroupStyle>
                    <ListView.ItemTemplate>
                        <DataTemplate x:DataType="data:Transaction">
                            <Grid Height="60" Margin="0,5,0,5" Background="White" CornerRadius="5">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="5" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <StackPanel Background="{Binding Path=VendorAccentColor}" CornerRadius="5,0,0,5" />
                                <StackPanel VerticalAlignment="Center" Margin="10,0,0,0" Grid.Column="1" Orientation="Vertical">
                                    <TextBlock Text="{Binding Path=VendorName}" FontSize="16" Foreground="#999999" />
                                    <TextBlock Text="{Binding Path=Recipient, Converter={StaticResource RecipientConverter}}" FontSize="16" Foreground="#999999" />
                                </StackPanel>
                                <TextBlock Grid.Column="2" Text="{Binding Path=Sum, Converter={StaticResource SumConverter}}" VerticalAlignment="Center" Canvas.ZIndex="2" Margin="0,0,10,0" FontSize="18" FontWeight="Bold" />
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

这是我的转换器的 C# 代码

public object Convert(object value, Type targetType, object parameter, string language)
    {
        string recipient = (string)value;
        // Here is a way I want it to be
        string sum = (string)parameter;

        if (HalykWallet_v03.Model.AppSettings.GetAppLang() == "ru")
        {
            if (sum.Contains("-"))
                return "На " + recipient;
            else
                return "От " + recipient;
        }
        else
        {
            char[] array = sum.ToCharArray();
            if (sum.Contains("-"))
            {
                switch (array.Last())
                {
                    case '0':
                    case '1':
                    case '2':
                        recipient += recipient + "-ден";
                        break;
                    case '3':
                    case '4':
                    case '5':
                        recipient += recipient + "-тен";
                        break;
                    case '6':
                        recipient += recipient + "-дан";
                        break;
                    case '7':
                    case '8':
                        recipient += recipient + "-ден";
                        break;
                    case '9':
                        recipient += recipient + "-дан";
                        break;
                    default:
                        break;
                }
            }
            else
            {
                switch (array.Last())
                {
                    case '0':
                    case '1':
                    case '2':
                        recipient += recipient + "-ге";
                        break;
                    case '3':
                    case '4':
                    case '5':
                        recipient += recipient + "-ке";
                        break;
                    case '6':
                        recipient += recipient + "-ға";
                        break;
                    case '7':
                    case '8':
                        recipient += recipient + "-ден";
                        break;
                    case '9':
                        recipient += recipient + "-ға";
                        break;
                }
            }

            return recipient;
        }
    }

【问题讨论】:

    标签: xaml windows-phone-8.1 win-universal-app uwp windows-10-universal


    【解决方案1】:

    您可以在转换器中使用依赖属性。This 应该会有所帮助。

    【讨论】:

    • 您好!感谢您的回复!我阅读了您提到的主题并使用 DependencyProperty 编辑了我的代码。但是,这里有个小问题。我的 ListView 绑定到我的 ViewModel 中的列表(ItemsSource 设置为 List),所以我必须将我的 DependencyProperty 绑定到我的列表中的项目。我怎样才能动态地做到这一点?
    • 您可以使用 elementname 绑定将转换器的依赖属性绑定到“sum”文本块。这应该可行,否则我建议您在视图模型中包含转换逻辑。
    • 您好!如您所知,我将 Hasan Hasanov 提出的解决方案与 CImbalino 工具包一起使用,但这是该工具包的问题。它总是在发布模式下抛出异常。所以,我使用 DependencyProperty 绑定返回到您的解决方案,但 ElementName 绑定不起作用)还有其他想法吗?
    • 您在哪里声明了您的转换器?在 app.xaml 或您的页面中?初始化转换器并在列表视图的数据模板的网格资源中进行绑定。
    • 哦哦哦。真的,这很容易)我在我的页面资源中声明了它。现在我知道我的错误在哪里)再次感谢你:)
    【解决方案2】:

    绑定而不是 x:bind 解决了我的问题。也许这会节省某人的一天。 Here is the link

    【讨论】:

      【解决方案3】:

      您好,您尝试将其绑定为转换器参数吗?

       <StackPanel VerticalAlignment="Center" Margin="10,0,0,0" Grid.Column="1" Orientation="Vertical">
        <TextBlock Text="{Binding Path=VendorName}" FontSize="16" Foreground="#999999" />
        <TextBlock Name="txtRecipient" Text="{Binding Path=Recipient, Converter={StaticResource RecipientConverter}}" FontSize="16" Foreground="#999999" />
      </StackPanel>
      <TextBlock Grid.Column="2" Text="{Binding Path=Sum, Converter={StaticResource SumConverter},ConverterParameter={Binding ElementName=txtrec}}" VerticalAlignment="Center" Canvas.ZIndex="2" Margin="0,0,10,0" FontSize="18" FontWeight="Bold" />
      

      但是,您可以使用 Cimbalino Windows phone 工具包在 UWP 中模拟多重绑定。看看here

      【讨论】:

      • 不,不幸的是它不起作用,在转换器内部参数等于NULL。我在某处读到 ConverterParameter 不支持绑定。这就是问题所在……
      • 您可以使用 Cimbalino windows phone 工具包模拟多重绑定行为:pedrolamas.com/2013/05/17/…
      • 我在将应用程序发布到应用商店时发现该工具包存在问题。如果您在发布模式下运行应用程序,此工具包总是会引发异常。这是作者已知的问题,但他不知道如何解决)
      • 无法与 ConverterParameter 绑定
      猜你喜欢
      • 2019-01-28
      • 2020-01-03
      • 2017-02-18
      • 2011-05-29
      • 2013-05-29
      • 2012-12-26
      • 2018-03-31
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多