2016-11-03 4 views
0

ボタンがあります。リストボックスの中で好きなトグルボタンにしたい。以下のコードを参照してください:ボタンの内容はリアルタイムで変更されません

<Page 
    x:Class="W.Pages.ExPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Workout_EF.Pages" 
    xmlns:converter="using:W.Converters" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:data="using:W.Model" 
    mc:Ignorable="d"> 
    <Page.Resources> 
     <converter:FavoriteValueConverter x:Key="favoriteConverter" /> 
    </Page.Resources> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ListBox Name="MyListbox" 
      SelectionMode="Single"       
      ItemsSource="{x:Bind exs}" 
      SelectionChanged="MyListbox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate x:DataType="data:Ex"> 
        <StackPanel Orientation="Horizontal"> 
         <Button Name="IsFavoriteToggle" Click="IsFavoriteToggle_Click"> 
          <Button.Content> 
           <TextBlock 
            x:Name="isFavoriteTextBlock" 
            Text="{x:Bind IsFavorite, Converter={StaticResource favoriteConverter}}" 
            FontFamily="Segoe MDL2 Assets"/> 
          </Button.Content> 
         </Button> 
         <TextBlock 
          VerticalAlignment="Center" 
          FontSize="16" 
          Text="{Binding ExName}" 
          Margin="20,0,0,0" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Page> 

私の問題は、私は、このボタンを押したときに、それはリアルタイムで(emtpy星から完全な星とその逆に)それにアイコンを変更しませんです。

リストボックスを再度読み込むと、正しいアイコンが表示されます。

の背後にあるコードは次のとおりです。

namespace W.Pages 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class ExPage : Page 
    { 
     ObservableCollection<Exs> exs = new ObservableCollection<Exs>();   
     public ExPage() 
     { 
      this.InitializeComponent(); 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      List<Exs> tmpEx = e.Parameter as List<Exs>; 
      foreach (Exs item in tmpEx) 
      { 
       exs.Add(item); 
      }    
     } 

     private void IsFavoriteToggle_Click(object sender, RoutedEventArgs e) 
     {    
      Button button = sender as Button; 
      int index = MyListbox.Items.IndexOf(button.DataContext);    
      Ex ex = (Exs)MyListbox.Items[index]; 
      DAL.SetToFavorite(ex, !ex.IsFavorite); 
     } 
    } 
} 

私は多分itemsourceといくつかの問題があることに気づきました。ボタンを押すと内容を変更する必要がありました。しかし、私は確信していません。

答えて

3

これはよくある間違いであり、実際にはObservableCollection<T>は、コレクション内のオブジェクトではなく、コレクションの変更についてバインダーに通知しています。 あなたはボタンが変更について知るが、そのために、EsxニーズがINotifyPropertyChanged

thisを参照してください、あなたはより多くの助けポストESXクラスのコードが必要な場合は、多分私達は助けることができる実装する必要があなたのEsxクラスのIsFavorite性質を持っています。

1

Emaud氏によると、EsxクラスにINotifyPropertyChangedインターフェイスを実装する必要があります。 x:Bindの場合、デフォルトモードはOneTimeなので、変更をリッスンしないため、ModeOneWayに設定する必要があります。

Text="{x:Bind IsFavorite, Mode=OneWay, Converter={StaticResource favoriteConverter}}" 
関連する問題