【问题标题】:displaying listbox in grid在网格中显示列表框
【发布时间】:2011-10-16 08:02:07
【问题描述】:

这可能是一个愚蠢的问题,但我坚持这样做:(。我有一个网格和 3 列。我在这 3 列中的每一列中都有一个文本框和一个列表框,如图所示:

<Grid.ColumnDefinitions>
                <ColumnDefinition Width="130"></ColumnDefinition>
                <ColumnDefinition Width="380"></ColumnDefinition>
                <ColumnDefinition Width="146"></ColumnDefinition>
             </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="30"></RowDefinition>
            </Grid.RowDefinitions>
            <StackPanel Grid.Column="0" Grid.Row="0">
                <TextBox Text="File Name" Height="30"></TextBox>
            </StackPanel>
            <StackPanel Grid.Column="1" Grid.Row="0">
                <TextBox Text="File Path" Height="30"></TextBox>
            </StackPanel>
            <StackPanel Grid.Column="2" Grid.Row="0">
                <TextBox Text="File Size" Height="30"></TextBox>
            </StackPanel>

            <StackPanel Grid.Column="0">
                <ListBox Name="listbox_name" Margin="1,30" Height="276" />
             </StackPanel>
            <StackPanel Grid.Column="1">
                <ListBox Name="listbox_path" Margin="1,30" Height="276" />
            </StackPanel>
            <StackPanel Grid.Column="2">
                <ListBox Name="listbox_size" Margin="1,30" Height="276" />
            </StackPanel>

及其背后的代码:

public Window1()
        {
        InitializeComponent();

        list.Add("D:\\a\\hy");
        list.Add("D:\\a\\hy1");
        list.Sort();           
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        listbox_name.ItemsSource = list;
        grid1.Visibility = Visibility.Hidden;
    }


    private void button1_Click(object sender, RoutedEventArgs e)
    {
        grid1.Visibility = Visibility.Visible;
    }

但是在单击按钮时,我看不到列表框,并显示了列表。请指导我哪里出错了。谢谢!

【问题讨论】:

  • 为什么要使用这么多堆栈面板来显示标题...只需使用 ListView 并在其中使用 GridView 并制作 GridView 列...。
  • 嗨,@adcool2007 我是新手,所以我不知道该怎么做。也会试试你的方法谢谢!

标签: c# wpf listbox grid stackpanel


【解决方案1】:

原因是您的stackPanelGrid.Col="0" 中,而且很小。但是ListBox 在你的stackPanel 里面。它有一个边际,它会下降。你是不是看不到你的listBox



如果你会做这样的事情:

<StackPanel Margin="0,0,0,-279">
            <ListBox Name="listbox_name" Margin="1,30" Height="276" />
        </StackPanel>

你会看到你的 listBox 并且它会工作。
注意:此代码仅为示例。你需要为你的窗口做一个更好的布局。



这是我制作窗口布局的方法:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="678" Loaded="Window_Loaded">
    <Grid Name="grid1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="130"></ColumnDefinition>
            <ColumnDefinition Width="380"></ColumnDefinition>
            <ColumnDefinition Width="146"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <TextBlock Text="File Name"  Grid.Row="0" Grid.Column="0" Margin="5" />
        <TextBlock Text="File Path"  Grid.Row="0" Grid.Column="1" Margin="5" />
        <TextBlock Text="File Size" Grid.Row="0" Grid.Column="2" Margin="5" />

        <ListBox Name="listbox_name" Grid.Row="1" Grid.Column="0" BorderBrush="Black" />
        <ListBox Name="listbox_path" Grid.Row="1" Grid.Column="1" BorderBrush="Black" />
        <ListBox Name="listbox_size" Grid.Row="1" Grid.Column="2" BorderBrush="Black" />
    </Grid>
</Window>

【讨论】:

  • 嗨,@sergey:谢谢,效果很好! :) 但是另外两个呢?我怎样才能显示它们?和所有 3 个一起?
  • 嗨,@sergey:是的,这正是我所需要的,谢谢! :) 我有一个扩展器,当扩展器展开时,我如何使网格可见(以及调整窗口大小以适应网格)?非常感谢!
  • 但在此,即使扩展器未展开,也会显示网格空间。单击扩展器时如何使窗口增大?
  • 嗯。现在我给了我的窗口 Height="181" Width="Auto" SizeToContent="WidthAndHeight"。我的按钮和扩展器在 grid1 之外。当我展开扩展器时,窗口大小确实会增加,但网格位于按钮和扩展器的顶部。我怎样才能避免这种情况?谢谢!
【解决方案2】:
    <ListView Name="list"
              Grid.Row="1" 
              ItemsSource={Binding Path=Files}                
              >
    <ListView.View>        
     <GridView>
        <GridViewColumn Header="Name">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Button>
                     <TextBlock Text="{BindingPath=Name}"/>                            
                    </Button>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Size">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Button>
                     <TextBlock Text="{BindingPath=Size}"/>                            
                    </Button>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Path">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Button>
                     <TextBlock Text="{BindingPath=Path}"/>                            
                    </Button>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
     </ListView.View>  
    </ListView>

我的 ViewModel 将是

public class FileListViewModel : INotifyPropertyChanged
{
    /// <summary>
    /// 
    /// </summary>
    public ObservableCollection<Fileinfo> Files{ get; set; }

    private Fileinfo selectedFile;

    public Fileinfo SelectedFile
    {
        get { return selectedFile; }
        set
        {
            selectedFile= value;
            InvokePropertyChanged(new PropertyChangedEventArgs("SelectedFile"));
        }
    }

    public PersonListViewModel()
    {
                //Loading List
                   Files= new ObservableCollection<Fileinfo>()
              {    //This is temp list you modify accordinh to you logic
                                   new FileInfo{Name = "File32"},
                                   new FileInfo{Name = "File33"},
                                   new FileInfo{Name = "File373"},
                                   new FileInfo{Name = "File393"},
                                   new FileInfo{Name = "File345"},
                                   new FileInfo{Name = "File375"},
                                   new FileInfo{Name = "File395"},
                                   new FileInfo{Name = "File387"},
                                   new FileInfo{Name = "File387"}
                               };
    }

    #region Implementation of INotifyPropertyChanged

    /// <summary>
    /// 
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// 
    /// </summary>
    /// <param name="e"></param>
    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    #endregion
}

你的模型应该是这样的

public class FileinFo: INotifyPropertyChanged
{
    private string size;
    public event PropertyChangedEventHandler PropertyChanged;
    private string name;
    private bool isSelected;

    public string Size
    {
        get { return size; }
        set
        {
            size= value;
            InvokePropertyChanged(new PropertyChangedEventArgs("size"));
        }
    }

    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("Name"));
        }
    }



    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("IsSelected"));
        }
    }

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }
}  

你需要将你的View的datacontext设置为ViewModel

假设您的视图被命名为 FileListView.xaml

然后在构造函数后面的代码中你可以写

this.DataContext= new FileListViewModel();

【讨论】:

  • 嗨,adcool,我知道我迟到了,但我正在尝试您建议的方法,因为我的要求是这样说的。我不确定这是否可能,但是在列表视图中有一种方法可以在其上显示一个数组列表吗?我需要绑定到一个类吗?谢谢!
  • @user877852 是您的数组列表具有相同类型的对象。然后只需使用 ItemsSource= {Binding Path=ListOfObjects}....此外,如果对象属于相同类型...使用通用 List
  • 嗨@adcool,对不起,但我是新手。我有三个数组列表。我将它们中的每一个放在不同的对象(名称、路径和大小)下,并使用 绑定它们我仍然没有得到正确的结果。我该如何继续?谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2020-05-21
相关资源
最近更新 更多