2017-07-31 51 views
2

我有一個ListBox,包含一個帶StackPanel的ItemTemplate.I將一個通用List分配給我的Listbox itemsource.I想更改該StackPanel的可見性。 (當我點擊mouseleftbutton「closeAll」並關閉ListBox中的所有stackPanel項目時,將它的可見性更改爲摺疊狀態)。我想用stackpanel visibility = {Binding Acikmi}來做到這一點。 我有PastAndOr類和它的屬性「Acikmi」,它的第一個值是「可見的」。 如何使用綁定雙向模式將「Acikmi」值從「visible」更改爲「collapsed」?如何在列表框中使用雙向綁定?

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!請確保您先閱讀了[如何提問](https://stackoverflow.com/help/asking)幫助頁面。我們希望看到一個[mcve](密切關注那個**最小**字)。我也修改了你的問題的標題,因爲它不應該包含強制標籤。 – dymanoid

+0

綁定不應該是雙向的。相反,你的按鈕動作應該直接設置應該不可見的所有'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像

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

刪除了'Mode = TwoWay'和'UpdateSourceTrigger = PropertyChanged'。兩者都沒有任何意義。除此之外,「你的班級應該是這樣的」並不能解釋任何事情。您可能需要在答案中添加一些解釋性細節。 – Clemens

+0

感謝克萊門斯很多東西學習 – Ramankingdom

+0

謝謝Ramankingdom和克萊門斯你的答案。但我怎麼能設置Acikmi屬性在「closeAll_MouseLeftButtonDown」方法,我能做什麼呢?我想設置「Acikmi」屬性的可見性。崩潰了。 – Barsblue

0

爲了更好地做到這一點在MVVM你可以使用一個ICommand。 一個ICommand實現的一個很好的例子可以發現here

基本上個ICommand可以綁定到ButtonBase.Command財產然而,在你的情況,你想將其鏈接到MouseLeftButtonDown事件。交互性觸發器正是爲此而存在的。

通過NuGet將Expressions Blend SDK添加到您的項目中。 添加交互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>