【问题标题】:Image Source not binding properly in DataTemplate in Windows 8 Mobile图像源在 Windows 8 Mobile 的 DataTemplate 中未正确绑定
【发布时间】:2014-01-06 08:44:20
【问题描述】:

我有这个需要分成两列的对象列表。然后我为列表的每个对象使用这个模板:

<DataTemplate x:Key="UnderlyingRealTimeExchangeRatesLongListSelector">
    <Grid Background="{Binding PriceChanged, Converter={StaticResource PriceChangedToBackgroundConverter}}"
        Margin="0,2.5,5,2.5" Tap="RealTimeElement_Tapped">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="txtUnderlyingName" Text="{Binding Name}" Foreground="White" 
            Style="{StaticResource NormalFontStyle}" HorizontalAlignment="Left"
            Margin="5" FontSize="25" Padding="10" TextWrapping="Wrap"/>
        <Image Grid.Column="1"
            Source="{Binding Path= Image, Converter={StaticResource ImageToFlagConverter}}"
            Height="30"></Image>
        <TextBlock x:Name="txtUnderlyingPrice" Text="{Binding Price, StringFormat='0:N2'}" 
            Grid.Row="1" Grid.ColumnSpan="2" Foreground="#FFD300"
            Style="{StaticResource LightFontStyle}" FontSize="40" 
            HorizontalAlignment="Right" VerticalAlignment="Center" Padding="10"/>
    </Grid>
</DataTemplate>

<phone:LongListSelector x:Name="llsRealTimeCurrencies1" Grid.Column="0" Margin="0,15,0,32"
    ItemTemplate="{StaticResource UnderlyingRealTimeExchangeRatesLongListSelector}" 
    Visibility="Collapsed"/>
<phone:LongListSelector x:Name="llsRealTimeCurrencies2" Grid.Column="1" Margin="0,15,0,32" 
    ItemTemplate="{StaticResource UnderlyingRealTimeExchangeRatesLongListSelector}" 
    Visibility="Collapsed"/>

这是转换器:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    //Returns The flag needed
    if (value != null)
    {
        string image = value.ToString().ToLower();
        string flag = "Assets\\flags\\" + image + "_flag.png";

        return Path.GetFullPath(flag);
    }
    else
    {
        return null;
    }
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    throw new NotImplementedException();
}

这是上一部分背后的代码:

private void SetAndShowCorrectRealTimeList<T>(LongListSelector[] list, IList<T> collection)
{
    //and make sure the grid holding the lists is visible
    grdRealtimeLists.Visibility = System.Windows.Visibility.Visible;

    List<LongListSelector> lists =
        new List<LongListSelector>()
        {
            llsRealTimeCommodities1,
            llsRealTimeCommodities2,
            llsRealTimeCurrencies1, 
            llsRealTimeCurrencies2,
            llsRealTimeIndecies1,
            llsRealTimeIndecies2,
            llsRealTimeWatchList1,
            llsRealTimeWatchList2
        };

    foreach (var item in lists.Except(list))
    {
        item.Visibility = System.Windows.Visibility.Collapsed;
    }

    for (int i = 0; i < list.Length; i++)
    {
        list[i].Visibility = Visibility.Visible;
        List<T> result = collection.Where((item, index) => index % 2 == i).ToList();
        list[i].ItemsSource = result;
    }
}

有趣的是,它在左列显示图像,但不在右列。事实上,它甚至没有进入第二列的转换器。谢谢!!!

【问题讨论】:

  • 只是为了确保它在一个 LongListSelector 中显示文本和图像,但在另一个中仅显示没有图像的文本?
  • 如果您将 Image 绑定替换为 DataTemplate 中的固定图像路径,即所有项目的相同图像,它会是什么样子。这是否显示在第二个 LongListSelector 中?
  • 不行,效果不好
  • 那么它与绑定无关,对吧?你还在用 DataTemplate 中的元素做其他事情吗?
  • 我已经想通了。谢谢

标签: image xaml binding windows-phone-8 datatemplate


【解决方案1】:

像这样绑定图片源。

<Image Grid.Column="1" Height="30">
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=Image, Converter={StaticResource ImageToFlagConverter}}" />
    </Image.Source>
</Image>

【讨论】:

  • 不,它真的不起作用。行为方式相同。实际上,第二列并没有真正进入转换器。
  • 可以分享左栏的代码吗?还要检查对象的值是否被赋值。
  • 我在后面添加了代码,所有对象都分配了 Image 值。
  • 属性路径必须是ImageSource
  • @MatDevWp8 不,它也可以是 Uri 或字符串。有内置的转换。
【解决方案2】:

检查您的代码是否包含所有正确的元素 - llsRealTimeCurrencies1,llsRealTimeCurrencies2。这些是我们用来将模板绑定到的列表:

private async void Currencies_Tapped(object sender, System.Windows.Input.GestureEventArgs e)
{
    mainViewModel.RealTimeViewModel.IsWatchListSettingsVisible = false; 
    ApplyForegroundFont(sender, realtimeTabs);
    FrameworkElement parent = (FrameworkElement)((TextBlock)sender).Parent;
    ApplyBackgroundColor(parent, realtimeTabsGrid);
    if (!mainViewModel.RealTimeViewModel.CurrencyExchangeRates.Any())
    {
         if (mainViewModel.RealTimeViewModel.Realtime != null &&
             mainViewModel.RealTimeViewModel.Realtime.Underlyings != null && 
             mainViewModel.RealTimeViewModel.Realtime.Underlyings.Any())
         {
                 mainViewModel.RealTimeViewModel.InitializeCurrencies();
         }
         else
         {
                 mainViewModel.RealTimeViewModel.LoadProductsOrUnderlyingsFromDb<Currency>(mainViewModel.RealTimeViewModel.CurrencyExchangeRates);
         }
    }
    if (!App.Settings.Contains(currenciesWereSaved))
    {
        App.Settings.Add(currenciesWereSaved, "");
        App.Settings.Save();
        await Task.Factory.StartNew(() => 
          mainViewModel.RealTimeViewModel.SaveUnderlyingsAndProducts<Currency>(mainViewModel.RealTimeViewModel.CurrencyExchangeRates));
    }
    SetAndShowCorrectRealTimeList(new LongListSelector[] { llsRealTimeCurrencies1, llsRealTimeCurrencies2 }, mainViewModel.RealTimeViewModel.CurrencyExchangeRates);
    GoogleAnalytics.EasyTracker.GetTracker().SendEvent("Real time", "click", "Currencies", 0);

    MyBindableBase.LightstreamerClientInstance.Subscribe(mainViewModel.RealTimeViewModel.CurrencyExchangeRates.Cast<IRealtimeProperty>().ToList());
}

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 2011-04-21
    • 1970-01-01
    • 2020-03-22
    • 2013-09-23
    • 1970-01-01
    • 2013-02-14
    • 2011-10-06
    • 2012-10-09
    相关资源
    最近更新 更多