2017-07-31 14 views
2

私はStackPanelを持つItemTemplateを含むListBoxを持っています。リストボックスのitemsource.Iに汎用リストを割り当てます。そのスタックパネルの可視性を変更したいと思います。 (mouseleftbutton "closeAll"をクリックしてリストボックス内のすべてのstackPanel項目を閉じると、折りたたまれた状態になるのを変更します)。これはstackpanel visibility = {Binding Acikmi}で行います。 私はPastAndOrクラスとそのプロパティ "Acikmi"を持っていて、最初の値は "可視"です。 バインディング双方向モードを使用して、「可視」から「折りたたみ」に「Acikmi」の値を変更する方法はありますか?ListBoxで双方向バインディングを使用するにはどうすればよいですか?

public static List<PastAndOr> GetPastOr() 
{ 
    string connStr = "server=localhost;user=root;database=carbovisor;port=3306;password=12345"; 
    MySqlConnection conn = new MySqlConnection(connStr); 
    conn.Open(); 
    MySqlCommand cmd = new MySqlCommand("SELECT s.sarjno as sarjno,s.createdate as createdate,m.adi as madi,mp.parcakodu as parcakodu,mp.parcaadi as parcaadi,mp.malzeme as malzeme,mr.kodu as musterikodu,mr.adi as musteriadi FROM t_sepetler s JOIN t_mamul m ON [email protected] OR m.id=s.mamulid LEFT JOIN t_musteriparca mp ON mp.firmaid=s.musteriid LEFT JOIN t_musteriler mr ON mr.id=mp.firmaid WHERE s.createdate >= @tarih1 AND s.createdate <= @tarih2 GROUP BY sarjno,madi ORDER BY createdate DESC", conn); 
    cmd.Parameters.AddWithValue("@tarih1", PastProcess.tarih1); 
    cmd.Parameters.AddWithValue("@tarih2", PastProcess.tarih2); 
    cmd.Parameters.AddWithValue("@receteadi", PastProcess.receteadi); 
    cmd.Parameters.AddWithValue("@sarjno", PastProcess.sarjno); 

    MySqlDataReader dataReader = cmd.ExecuteReader(); 
    List<PastAndOr> or = new List<PastAndOr>(); 
    PastAndOr kayit2; 
    int IDSayac = 1; 
    while (dataReader.Read()) 
    { 
     kayit2 = new PastAndOr(); 

     kayit2.Adi = dataReader["madi"].ToString(); 
     kayit2.SarjNo = dataReader["sarjno"].ToString(); 
     kayit2.CreateDate = dataReader["createdate"].ToString(); 
     kayit2.ParcaKodu = dataReader["parcakodu"].ToString(); 
     kayit2.ParcaKoduAdi = dataReader["parcakodu"].ToString() + " - " + dataReader["parcaadi"].ToString(); 
     kayit2.Malzeme = dataReader["malzeme"].ToString(); 
     kayit2.MusteriKodu = dataReader["musterikodu"].ToString(); 
     kayit2.MusteriKoduAdi = dataReader["musterikodu"].ToString() + " - " + dataReader["musteriadi"].ToString(); 

     kayit2.Acikmi = Visibility.Visible; 

     kayit2.ID = IDSayac; 

     or.Add(kayit2); 
     IDSayac++; 
    } 

    conn.Close(); 

    return or; 
} 

private void closeAll_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    // what goes here? 
} 


public class PastAndOr 
{ 
    public Visibility Acikmi { get; set; } 
    public int ID { get; set; } 
    public string Adi { get; set; } 
    public string SarjNo { get; set; } 
    public string CreateDate { get; set; } 
    public string ParcaKodu { get; set; } 
    public string ParcaKoduAdi { get; set; } 
    public string Malzeme { get; set; } 
    public string MusteriKodu { get; set; } 
    public string MusteriKoduAdi { get; set; } 
} 

XAMLコード

<ListBox x:Name="listBoxEditPast" SelectionMode="Single" Margin="0" Background="#272B34" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition/> 
            <RowDefinition/> 
           </Grid.RowDefinitions> 
           <Border Grid.Row="0" BorderThickness="4,0,0,0" Margin="2,0,0,0" Height="29" Background="#2E323B" Width="1050" BorderBrush="#1373A9" MouseLeftButtonDown="Border_MouseLeftButtonDown"> 
            <DockPanel Name="dockPanelPast" Margin="0,4,0,0"> 
             <Image Name="imgArrow" Source="images/down-arrow.png" HorizontalAlignment="Left" Width="20" Height="18"/> 
             <TextBlock Text="{Binding CreateDate}" Name="txtTarih" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16"/> 
             <TextBlock Text="{Binding SarjNo}" Name="txtSarjNo" Foreground="#FF9CA518" HorizontalAlignment="Stretch" VerticalAlignment="Center" FontSize="16" Margin="50,0,0,0" Width="90"/> 
             <TextBlock Text="{Binding Adi}" Name="txtReceteAdi" Foreground="#FF26A053" VerticalAlignment="Center" FontSize="16" Margin="40,0,0,0" HorizontalAlignment="Stretch"/> 
             <Button Content="Detaylar" Style="{StaticResource BlueButton}" HorizontalAlignment="Right" VerticalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" DockPanel.Dock="Right"/> 
            </DockPanel> 
           </Border> 
           <StackPanel Grid.Row="1" Name="stackPanelDetay" Tag="{Binding ID}" Visibility="{Binding Acikmi,Mode=TwoWay}"> 
            <DockPanel> 
             <TextBlock Text="Sipariş No" Foreground="#D9480F" VerticalAlignment="Center" /> 
             <TextBlock Text="Parça" Foreground="#AF0FD9" VerticalAlignment="Center" Margin="50,0,0,0" Width="200" /> 
             <TextBlock Text="Malzeme" Foreground="White" VerticalAlignment="Center" Margin="150,0,0,0" Width="90"/> 
             <TextBlock Text="Müşteri" Foreground="#AF0FD9" VerticalAlignment="Center" Margin="70,0,0,0" /> 
            </DockPanel> 
            <DockPanel> 
             <TextBlock Text="{Binding ID}" Foreground="White" VerticalAlignment="Center" Width="100"/> 
             <TextBlock Text="{Binding ParcaKoduAdi}" Foreground="White" VerticalAlignment="Center" Margin="5,0,0,0" Width="200" /> 
             <TextBlock Text="{Binding Malzeme}" Foreground="White" VerticalAlignment="Center" Margin="152,0,0,0" Width="90" /> 
             <TextBlock Text="{Binding MusteriKoduAdi}" Foreground="White" VerticalAlignment="Center" Margin="70,0,0,0" /> 
            </DockPanel> 
           </StackPanel> 
          </Grid> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
+0

はStackOverflowのへようこそ!まず[How to Ask](https://stackoverflow.com/help/asking)のヘルプページをお読みください。私たちは[mcve]を見たいと思っています(** minimal **の単語に細心の注意を払ってください)。あなたの質問のタイトルを変更しました。なぜなら、強制タグを含むべきではないからです。 – dymanoid

+0

バインディングはTwoWayであってはなりません。代わりに、あなたのボタンアクションは、不可視でなければならないすべての 'PastAndOr'アイテムの' Acikmi'プロパティを直接設定する必要があります。したがって、クラスはINotifyPropertyChangedインターフェイスを実装し、プロパティ値が変更されたときにPropertyChangedイベントを発生させる必要があります。 – Clemens

+0

INotifyPropertyChangedがありません。 – Ramankingdom

答えて

0

あなたのクラスはINoyifyPropertyChangedインタフェースを実装する必要があります。詳細については、WPF INoyifyPropertyChangedを参照してください。

public class PastAndOr:INotifyPropertyChanged 
{ 
    public Visibility _acikmi; 
    public Visibility Acikmi 
    { 
     get {return _acikmi; } 
     set 
     { 
      _acikmi = value; 
      OnPropertyChaged(nameof(Acikmi)); 
     } 
    } 
    public int ID { get; set; } 
    public string Adi { get; set; } 
    public string SarjNo { get; set; } 
    public string CreateDate { get; set; } 
    public string ParcaKodu { get; set; } 
    public string ParcaKoduAdi { get; set; } 
    public string Malzeme { get; set; } 
    public string MusteriKodu { get; set; } 
    public string MusteriKoduAdi { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChaged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

とXAML最高のあなたはのICommandを使用しMVVMでこれを行うには

<StackPanel Grid.Row="1" Name="stackPanelDetay" Tag="{Binding ID}" Visibility="{Binding Acikmi}"> 
+0

'Mode = TwoWay'と' UpdateSourceTrigger = PropertyChanged'を削除しました。どちらも意味をなさない。それ以外に、 "あなたのクラスはこのようにすべきだ"とは何も説明していない。あなたの答えにいくつかの説明の詳細を追加したいかもしれません。 – Clemens

+0

おかげでClemensは多くのことを学ぶ – Ramankingdom

+0

あなたのanswer.ButのためにRamankingdomとClemensに感謝します。私は "closeAll_MouseLeftButtonDown"メソッドのAcikmiプロパティをどのように設定できますか?崩壊した – Barsblue

0

ようになります。 ICommandの実装の 良い例は、基本的にICommandsは、あなたがのMouseLeftButtonDownイベントにリンクしたいと思い、あなたのケースでただしButtonBase.Commandプロパティにバインドすることができhere

を見つけることができます。相互作用のトリガーは、この目的のために正確に存在します。

Expressions Blend SDKをNuGet経由でプロジェクトに追加します。 は、あなたの名前空間に対話のxmlnsを追加します。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

そして最後に、このように、トリガーとアクションを使用して、ICommandのプロパティにリンクされています

<Border> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="MouseLeftButtonDown"> 
       <i:InvokeCommandAction Command="{Binding Path=MyCommand}"></i:InvokeCommandAction> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Border> 
関連する問題