привязка данных видимости Windows Phone в шаблоне элемента списка - PullRequest
1 голос
/ 27 января 2012

У меня проблема с видимостью элемента управления в шаблоне элемента списка.Ниже приведен мой код для привязки данных к свойству Visibility для imagetools: AnimatedImage и Textblock в xaml:

<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, "");
            }
        }

Я также делаю некоторые другие привязки данных в этих файлах, всеони работают.Только это связывание Видимости терпит неудачу.На самом деле не знаю почему.= (Есть идеи? Спасибо !!!

1 Ответ

2 голосов
/ 27 января 2012

Похоже, ваш ListBox ItemsSource связан с коллекцией объектов "Tag". Это означает, что каждый ListBoxItem будет связан с объектом «Tag». Итак, создаваемый вами DataTemplate имеет DataContext, равный одному объекту Tag. Я не вижу, что LogoVisibility находится на объекте Tag. Похоже, что это на объекте, который содержит ссылку на список тегов. Пройдя по этому маршруту, вы захотите LogoVisibility и NameVisibility для самого объекта Tag.

То, что я хотел бы предложить, это не помещать эту логику в объект модели (тег), а вместо этого иметь 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...