【问题标题】:windows phone visibility data binding in listbox itemtemplate列表框项模板中的 Windows Phone 可见性数据绑定
【发布时间】:2012-01-26 23:02:42
【问题描述】:

列表框项模板中的控件可见性存在问题。以下是我将数据绑定到 xaml 中 imagetools:AnimatedImage 和 Textblock 的 Visibility 属性的代码:

<ListBox x:Name="listSellers" ItemsSource="{Binding TagList}" SelectionChanged="listSellers_SelectionChanged" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <Grid Margin="0,12,0,12" Height="132">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto" MinWidth="107"/>
                                                    <ColumnDefinition/>
                                                </Grid.ColumnDefinitions>
                                                <Border Grid.Column="0" Margin="0,0,-2,8">
                                                    <Grid>
                                                        <imagetools:AnimatedImage Source="{Binding Seller.Logo, Converter={StaticResource ImageConverter}}" Stretch="Uniform" Width="240" Template="{StaticResource AnimatedImageControlTemplate1}" Visibility="{Binding LogoVisibility}"/>
                                                        <TextBlock x:Name="sellerNameTxtBlock" TextWrapping="Wrap" Text="{Binding Seller.Name}" FontSize="24" FontFamily="Segoe WP" Margin="10,0,0,0" Foreground="#FF354F59" Height="41" Visibility="{Binding Path=SellerNameVisibility}"/>
                                                    </Grid>
                                                </Border>
                                                <StackPanel Grid.Column="1" Orientation="Vertical">
                                                    <!--<TextBlock TextWrapping="Wrap" Text="{Binding Seller.Name}" FontSize="24" FontFamily="Segoe WP" Margin="10,0,0,0" Foreground="#FF354F59" Height="41"/>-->
                                                    <!--<TextBlock TextWrapping="Wrap" Text="amazon.com" FontSize="16" FontFamily="Segoe WP" Margin="10,0,0,0" Foreground="#FF157CCC" Height="35"/>-->
                                                    <TextBlock TextWrapping="Wrap" Text="{Binding TotalPrice}" FontSize="21.333" FontFamily="Segoe WP Semibold" Margin="10,0,0,0" Foreground="#cc4225"/>
                                                    <TextBlock FontSize="{StaticResource PhoneFontSizeSmall}" Text="{Binding Price}" Margin="10,0,0,0" Foreground="#FF354F59"/>
                                                    <TextBlock FontSize="{StaticResource PhoneFontSizeSmall}" Text="{Binding Tax}" Margin="10,0,0,0" Foreground="#FF354F59"/>
                                                    <TextBlock FontSize="{StaticResource PhoneFontSizeSmall}" Text="{Binding Shipping}" Margin="10,0,0,0" Foreground="#FF354F59"/>
                                                </StackPanel>
                                            </Grid>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
</ListBox>

以下是视图模型中属性的声明:

public Visibility LogoVisibility
        {
            get { return (Visibility)GetValue(LogoVisibilityProperty); }
            set { SetValue(LogoVisibilityProperty, value); }
        }

        // Using a DependencyProperty as the backing store for LogoVisibility.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty LogoVisibilityProperty =
            DependencyProperty.Register("LogoVisibility", typeof(Visibility), typeof(ProductDetailViewModel), new PropertyMetadata(Visibility.Collapsed));

        public Visibility  SellerNameVisibility
        {
            get { return (Visibility )GetValue(SellerNameVisibilityProperty); }
            set { SetValue(SellerNameVisibilityProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SellerNameVisibility.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SellerNameVisibilityProperty =
            DependencyProperty.Register("SellerNameVisibility", typeof(Visibility), typeof(ProductDetailViewModel), new PropertyMetadata(Visibility.Collapsed));

以下是我在视图模型中设置可见性的地方:

foreach (Tag tag in tagArray)
                {
                    if (tag.Seller.Logo.Equals(""))
                    {
                        tag.Seller.Logo = "Images/NoImageFound.png";
                        LogoVisibility = Visibility.Collapsed;
                        SellerNameVisibility = Visibility.Visible;
                    }
                    else
                    {
                        LogoVisibility = Visibility.Visible;
                        SellerNameVisibility = Visibility.Collapsed;
                    }
                    tag.Price = "Base: " + tag.Price;
                    if (tag.Tax == null)
                    {
                        tag.Tax = "Tax: N/A";
                    }
                    else
                    {
                        tag.Tax = "Tax: " + tag.Tax;
                    }
                    if (tag.Shipping == null)
                    {
                        tag.Shipping = "Ship: N/A";
                    }
                    else
                    {
                        tag.Shipping = "Ship: " + tag.Shipping;
                    }
                    tempTagList.Add(tag);
                }
                TagList = tempTagList;
            }

这是我在后面的代码中设置数据上下文的地方:

protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            _productDetailViewModel = new ProductDetailViewModel();
            DataContext = _productDetailViewModel;
            string productTitleId = "";
            if (NavigationContext.QueryString.TryGetValue("productTitleId", out productTitleId))
            {
                _productTitleId = productTitleId;
                _productDetailViewModel.getProductDetailFromServer(_productTitleId, "");
            }
        }

我还在这些文件中做了一些其他的数据绑定,它们都有效。只有这个可见性绑定失败。真的不知道为什么。 =(有什么想法吗?谢谢!!!

【问题讨论】:

  • 对不起,我没有清楚地描述我的问题。我想要做的是如果标志不为空,显示标志,隐藏卖家名称。当 logo 为空时,隐藏 logo,显示卖家名称。但是,在这两种情况下,都会显示徽标和卖家名称。

标签: c# windows-phone-7 xaml


【解决方案1】:

看起来您的 ListBox ItemsSource 已绑定到“Tag”对象的集合。这意味着每个 ListBoxItem 都将绑定到一个“Tag”对象。因此,您正在创建的 DataTemplate 的 DataContext 等于一个 Tag 对象。我没有看到 LogoVisibility 在 Tag 对象上。看起来它位于包含对标记列表的引用的对象上。走这条路,你会想要 Tag 对象本身的 LogoVisibility 和 NameVisibility。

我的建议是不要将该逻辑放入您的模型对象(标签)中,而是使用 ValueConverter 来处理此逻辑。

    public class EmptyToVisibilityConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return Visibility.Collapsed;

        string val = value.ToString();

        return string.IsNullOrWhiteSpace(val) ? Visibility.Collapsed : Visibility.Visible;
    }

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

    #endregion
}

然后将您的可见性绑定更改为:

    <Grid DataContext="{Binding Seller}">
        <imagetools:AnimatedImage Source="{Binding Logo, Converter={StaticResource ImageConverter}}" 
                              Stretch="Uniform" Width="240" 
                              Template="{StaticResource AnimatedImageControlTemplate1}" 
                              Visibility="{Binding Logo, Converter={StaticResource EmptyToVis}}"/>
        <TextBlock x:Name="sellerNameTxtBlock" TextWrapping="Wrap" Text="{Binding Name}" FontSize="24" 
               FontFamily="Segoe WP" Margin="10,0,0,0" Foreground="#FF354F59" Height="41" 
               Visibility="{Binding Name, Converter={StaticResource EmptyToVis}}"/>
    </Grid>

【讨论】:

  • 嗨,肖恩,感谢您的帮助,它就像一个魅力!我还在link这里发布了另一个与windows phone相关的问题@我还没有找到解决方案。你能帮我看看吗?如果您需要更多信息,请告诉我!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2015-05-30
  • 2014-04-17
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多