1

だから、私はコードを持っています:

<tool:LongListSelector x:Name="citiesListGropus" Background="Transparent" 
   ItemTemplate="{StaticResource citiesItemTemplate}"                    
   GroupHeaderTemplate="{StaticResource groupHeaderTemplate}" 
   GroupItemTemplate="{StaticResource groupItemTemplate}" Height="468" Margin="0,68,0,0">
      <tool:LongListSelector.GroupItemsPanel>
         <ItemsPanelTemplate>
            <tool:WrapPanel/>
         </ItemsPanelTemplate>
      </tool:LongListSelector.GroupItemsPanel>
</tool:LongListSelector>  

そして、持っているDataTemplate

<DataTemplate x:Key="groupHeaderTemplate" x:Name="groupHeaderTemplateName">
   <Border Background="{StaticResource PhoneAccentBrush}" Width="75" Height="75" Margin="-333, 15, 0, 15" x:Name="groupHeaderName">
      <TextBlock Text="{Binding Title}" FontSize="40" Foreground="White" Margin="15, 15, 0, 0"/>
   </Border>
</DataTemplate>

Visibilityのプロパティを変更するにはどうすればよいBorderですDataTemplateか?隠したいDataTemplate。ただし、データをなどのプロパティにバインドすることはできません。これは、TextBlock Text="{Binding Title}"データを一度バインドした後、データバインド後にいくつかのプロパティを変更する必要があるためです。

何か案は?

更新1

したがって、私の主な目標は、都市のリストをフィルタリングすることです。名前でフィルタリングしたい。

私のアルゴリズム:

1)からデータを取得しますWebService

2)ロードするViewModel

  if (!App.CitiesViewModel.IsDataLoaded)
     {
         App.CitiesViewModel.LoadData(serviceResponse.Result);
     }

3)都市を名前でグループ化します。このコードのような私のコード。これは、特にLongListSeletstorテンプレートを使用する必要がある場合に重要です。

はい、データの準備ができました。今、私はWebサービスを必要としません。

<!-- The template for city items -->
        <DataTemplate x:Key="citiesItemTemplate">
            <StackPanel Name="PlacePanel" 
                Orientation="Horizontal" Margin="0,0,0,17" 
                Tag="{Binding Id}"  Visibility="{Binding IsVisibility}">
                <Image Height="75" Width="75" HorizontalAlignment="Left" Margin="12,0,9,0" Name="Image" Stretch="Fill" VerticalAlignment="Top" Source="{Binding Image}"/>
                <StackPanel Width="311">
                    <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>

都市の名前をTextBox入力すると、不要な都市が非表示になります。データバインディングとを使用できるINotifyPropertyChangedので、都市を非表示にできます。

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
           TextBox name = (TextBox)sender;

           foreach(var place in App.CitiesViewModel.Items
               .Where(city => (city.Name.Contains(name.Text)) && (city.IsShow == true)))
           {
               city.IsVisibility = Visibility.Visible;
           }
           foreach (var city in App.CitiesViewModel.Items
               .Where(city => !city.Name.Contains(name.Text)))
           {
               city.IsVisibility = Visibility.Collapsed;
           }
        }

しかし、私にはいくつかの問題がありDataTemplateます。都市を検索するときにこれを隠すことはできません。

<DataTemplate x:Key="groupHeaderTemplate" x:Name="groupHeaderTemplateName">
   <Border Background="{StaticResource PhoneAccentBrush}" Width="75" Height="75" Margin="-333, 15, 0, 15" x:Name="groupHeaderName">
      <TextBlock Text="{Binding Title}" FontSize="40" Foreground="White" Margin="15, 15, 0, 0"/>
   </Border>
</DataTemplate>

都市の名前を入力すると、非表示にしGroupHeaderTemplateます。TextBoxフォーカスを失ったときのショーGroupHeaderTemplateここに画像の説明を入力してください

この写真をここで借りました。

アップデート2 私の間違いは私が使用しなかったということでしたPropertyChangedEventHandler。これをGroupCityプロパティに追加し、インターフェイスを実装した後、データバインディング後にINotifyPropertyChangedプロパティを変更できます。Data Template

private IList<Group<City>> citiesCollectionGroup;

    var cityByName = from city in App.ViewModel.Items 
group city by Convert.ToString(City.Name[0]).ToLower() 
into c orderby c.Key select new
 GroupCity<CitiesViewModel>(Convert.ToString(c.Key[0]).ToLower(), c);    
citiesCollectionGroup = cityByName.ToList();
this.citiesListGropus.ItemsSource = citiesCollectionGroup;  

public class GroupCity<T> : IEnumerable<T>, INotifyPropertyChanged
    {
        public GroupCity(string name, IEnumerable<T> items)
        {
            this.Title = name;
            this.IsVisibility = Visibility.Visible;
            this.Items = new List<T>(items);            
        }

        public override bool Equals(object obj)
        {
            GroupCity<T> that = obj as GroupCity<T>;

            return (that != null) && (this.Title.Equals(that.Title));
        }

        public string Title
        {
            get;
            set;
        }

        private Visibility _isVisibility;
        public Visibility IsVisibility
        {
            get
            {
                return _isVisibility;
            }
            set
            {
                _isVisibility = value;
                NotifyPropertyChanged("IsVisibility");
            }
        }

        public IList<T> Items
        {
            get;
            set;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            return this.Items.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.Items.GetEnumerator();
        }

        #endregion
    }

Xamlコード:

<DataTemplate x:Key="groupHeaderTemplate" x:Name="groupHeaderTemplateName">
   <Border Background="{StaticResource PhoneAccentBrush}" Width="75" Height="75" Margin="-333, 15, 0, 15" x:Name="groupHeaderName" Visibility="{Binding IsVisibility}">
      <TextBlock Text="{Binding Title}" FontSize="40" Foreground="White" Margin="15, 15, 0, 0"/>
   </Border>
</DataTemplate>

Visibilityこれで、 groupHeaderTemplateを変更できます。

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            foreach (GroupCity<CitiesViewModel> city in citiesCollectionGroup)
            {
                city.IsVisibility = Visibility.Collapsed;
            }
            //
        }



private void SearchText_LostFocus(object sender, RoutedEventArgs e)
        {
            foreach (GroupCity<CitiesViewModel> city in citiesCollectionGroup)
            {
                city.IsVisibility = Visibility.Visible;
            }
            //
        }
4

2 に答える 2

2

これを行うために、独自の単純な DataTemplateSelector を作成できます。詳細については、こちらをご覧ください。

于 2013-02-19T18:52:39.540 に答える
1

「DataTemplateで境界線のプロパティの可視性を変更するにはどうすればよいですか?DataTemplateを非表示にします。」プロパティに基づいてアイテムの可視性を変更したいことを理解しています。以下の例を参照してください。

(以下のコードが探している解決策ではない場合は、達成しようとしていることについてさらに情報を提供してください。この例で得た質問とコメントをもう一度読んでください。これがあなたのやりたいことではないかと思います。 、しかし私は推測したくないので、私はあなたの質問の私の解釈に答えているだけです)。

バインディングを使用すると、次のことができます。

  1. 可視性プロパティをVisibilityタイプのプロパティに直接バインドします(リストボックスとPerson1の例)
  2. Visibilityプロパティをブールプロパティにバインドし、コンバーターを使用してそれをVisibilityタイプ(listbox2およびPerson2 + BoolToVisクラス)​​に変換します。

他にも方法はありますが、私の意見では、これが最も簡単に実装できる2つの方法です。¨

以下のコードの結果: VSのスクリーンショット

意見:

<phone:PhoneApplicationPage 
x:Class="VisibilityWP.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
xmlns:VisibilityWP="clr-namespace:VisibilityWP"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid.Resources>
                <VisibilityWP:BoolToVis x:Key="BooleanToVisibilityConverter" />
        </Grid.Resources>
        <StackPanel>
            <ListBox x:Name="listBox" Height="300">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Border Width="200" Visibility="{Binding Visibility}" Background="Blue">
                            <TextBlock Text="{Binding Name}" FontSize="40" Foreground="White" Margin="15, 15, 0, 0"/>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <ListBox x:Name="listBox2" Height="300">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Border Width="200" Visibility="{Binding ShowBorder, Converter={StaticResource BooleanToVisibilityConverter}}" Background="Red">
                            <TextBlock Text="{Binding Name}" FontSize="40" Foreground="White" Margin="15, 15, 0, 0"/>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>

    </Grid>
</Grid>

背後にあるコード:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;
namespace VisibilityWP
{

    public partial class MainPage 
    {
        public MainPage()
        {
            InitializeComponent();
            DataContext = this;
            listBox.ItemsSource = new List<Person1>
                    {
                        new Person1 {Name = "Iris", Visibility = Visibility.Visible},
                        new Person1 {Name = "Somebody", Visibility = Visibility.Collapsed},
                        new Person1 {Name = "Peter", Visibility = Visibility.Visible},

                    };
            listBox2.ItemsSource = new List<Person2>
                    {
                        new Person2 {Name = "Iris", ShowBorder = true},
                        new Person2 {Name = "Mia", ShowBorder = true},
                        new Person2 {Name = "Somebody", ShowBorder = false}
                    };
        }
    }

    public class Person1
    {
        public string Name { get; set; }
        public Visibility Visibility { get; set; }
    }
    public class Person2
    {
        public string Name { get; set; }
        public bool ShowBorder { get; set; }
    }

    public sealed class BoolToVis : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value is Visibility && (Visibility)value == Visibility.Visible;
        }
    }
}
于 2013-02-19T14:18:31.093 に答える