2012-01-26 43 views
1

我有列表框項目模板中控件可見性的問題。以下是我的代碼將數據綁定到imagetools的Visibility屬性:在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; 
      } 

這裏就是我在代碼中設置DataContext的背後:

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

我也在這些文件中做了一些其他的數據綁定,它們都工作。只有這種可見性綁定失敗。真的不知道爲什麼。 =(任何想法?謝謝!!!

+0

對不起,我沒有描述清楚我的問題。我想要做的是如果徽標不是空的,顯示徽標,隱藏賣家名稱。當徽標爲空時,隱藏徽標並顯示賣家名稱。但是,在這兩種情況下,都會顯示徽標和賣家名稱。 – 2012-01-26 23:08:58

回答

2

看起來像你的ListBox ItemsSource綁定到一個「標記」對象的集合,這意味着每個ListBoxItem將綁定到一個「標記」對象所以,你是DataTemplate創建一個DataContext等於一個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> 
+0

嗨肖恩,謝謝你的幫助,它的作用就像一個魅力!我還在這裏發佈了另一個有關Windows Phone的問題[鏈接](http://stackoverflow.com/questions/8749285/listbox-is-not-updated-by-dependency-property-observablecollection)我還沒有解決方案。你能幫我看一下嗎?如果您需要更多信息,請告訴我!謝謝! – 2012-01-27 06:58:03

相關問題