如何在ListBox中使用双向绑定?

时间:2017-07-31 14:45:27

标签: c# wpf xaml binding listbox

我有一个包含带有StackPanel的ItemTemplate的ListBox。我将一个通用List分配给我的Listbox itemsource。我想改变该stackpanel的可见性。 (当我单击mouseleftbutton" closeAll"并关闭列表框中的所有stackPanel项目时,将其可见性更改为折叠。)我希望使用stackpanel visibility = {Binding Acikmi}来实现。 我有PastAndOr Class及其财产" Acikmi"它的第一个值是"可见"。 我怎样才能改变" Acikmi"价值来自"可见"到了#34;倒塌"使用绑定双向模式?

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 m.adi=@receteadi 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 CODE

<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>

2 个答案:

答案 0 :(得分: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}">

答案 1 :(得分:0)

为了在MVVM中做到这一点,你可以使用ICommand。 可以找到一个ICommand实现的好例子here

基本上ICommands可以绑定到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>