【问题标题】:WPF - Binding DataGrid items to the ListBox itemsWPF - 将 DataGrid 项绑定到 ListBox 项
【发布时间】:2017-05-13 14:11:42
【问题描述】:

我在将 DataGrid 项(可能是可编辑的)与 ListBox 项绑定时遇到问题。 我已将该项目添加到 DataGrid(在 cs 代码中),并且该项目未显示在 ListBox 项目中。

这里是 xaml 代码:

<Window x:Class="_303_slawinskam_5B.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:_303_slawinskam_5B"
    mc:Ignorable="d"
    Title="Movies manager" Height="600" Width="800" MinHeight="400" MinWidth="600" Loaded="Window_Loaded">
<Grid>

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

    <Grid.Background>
        <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="#007c04" Offset="0.0" />
            <GradientStop Color="#b2ffb4" Offset="1.0" />
        </LinearGradientBrush>
    </Grid.Background>

    <Menu Grid.ColumnSpan="2"  HorizontalAlignment="Left" Height="25" Margin="0,0,0,0" VerticalAlignment="Top" Width="792">
        <MenuItem Header="Menu" Width="55" Height="25">
            <MenuItem Header="Help" Click="Help_Click"/>
            <MenuItem Header="Add movies" Click="Add_Click" />
            <MenuItem Header="Exit" Click="Exit_Click" />
        </MenuItem>
    </Menu>

    <TabControl Margin="10,10,0,10" Background="Transparent" Grid.RowSpan="2">
        <TabItem Header="View" Margin="716,39,-735,-47">
            <ListBox Margin="0,0,67,0" Background="Transparent" ItemsSource="{Binding ElementName=dataGridMovies}" IsSynchronizedWithCurrentItem="True">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="Title: {Binding Title}"></TextBlock>
                            <TextBlock Text="Director: {Binding Director}"></TextBlock>
                            <TextBlock Text="Score: {Binding Score}"></TextBlock>
                            <TextBlock Text="Type: {Binding Type}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </TabItem>
        <TabItem Header="Edit" Margin="679,72,-703,-81">
            <DataGrid Margin="0,6,68,0" Background="Transparent" x:Name="dataGridMovies">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Title" Binding="{Binding Title}"/>
                    <DataGridTextColumn Header="Director" Binding="{Binding Director}"/>
                    <DataGridTextColumn Header="Score" Binding="{Binding Score}"/>
                    <DataGridTextColumn Header="Type" Binding="{Binding Type}"/>
                </DataGrid.Columns>
            </DataGrid>
        </TabItem>
    </TabControl>

</Grid>

这里是cs代码:

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    namespace _303_slawinskam_5B
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            }

            private void Help_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("You won't find any help here");
            }

            private void Add_Click(object sender, RoutedEventArgs e)
            {

            }

            private void Exit_Click(object sender, RoutedEventArgs e)
            {
                this.Close();
            }

            public class Movies
            {
                public string Title { get; set; }
                public string Director { get; set; }
                public string Score { get; set; }
                public string Type { get; set; }
            }

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                List<Movies> ml = new List<Movies>();

                dataGridMovies.DataContext = ml;

                Movies check = new Movies() { Title = "title", Director = "director", Score = "score", Type = "type" };
                dataGridMovies.Items.Add(check);
            }
        }
    }

请告诉我我必须更改什么,以便将添加到 DataGrid 的项目也添加到 ListBox 中。 谢谢。

【问题讨论】:

标签: c# wpf xaml datagrid listbox


【解决方案1】:

通过在您的代码中进行 2 次小的更正,它将按您的预期工作:

1) 在绑定ItemsSource 的ListView 时,您必须将Path 添加为DataGrid 的ItemsSource,如下所示。

<TabItem Header="View" Margin="716,39,-735,-47">
    <ListBox Margin="0,0,67,0" Background="Transparent" ItemsSource="{Binding ElementName=dataGridMovies,Path=ItemsSource}" IsSynchronizedWithCurrentItem="True">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="Title: {Binding Title}"></TextBlock>
                    <TextBlock Text="Director: {Binding Director}"></TextBlock>
                    <TextBlock Text="Score: {Binding Score}"></TextBlock>
                    <TextBlock Text="Type: {Binding Type}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</TabItem>

方法 1 --- 2) 您不应使用 Add 方法将项目添加到 DataGrid,而是将 DataGrid 的 ItemsSource 分配给 Movies 列表。因此,将您的 Window_Loaded 处理程序更改为

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    List<Movies> ml = new List<Movies>();

    dataGridMovies.DataContext = ml;

    Movies check = new Movies() { Title = "title", Director = "director", Score = "score", Type = "type" };
    Movies check1 = new Movies() { Title = "title1", Director = "director1", Score = "score1", Type = "type1" };
    var movies = new List<Movies> {check1, check};
    dataGridMovies.ItemsSource = movies;
}

方法 2 --- 2) 创建 ObservableCollection 的 Movies 并将该集合分配给 ItemsSource 的 DataGrid 并在需要时更新集合。这样就可以动态更新了。

private ObservableCollection<Movies> MoviesCol { get; set; }

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    List<Movies> ml = new List<Movies>();

    dataGridMovies.DataContext = ml;

    Movies check = new Movies() { Title = "title", Director = "director", Score = "score", Type = "type" };
    Movies check1 = new Movies() { Title = "title1", Director = "director1", Score = "score1", Type = "type1" };
    Movies check2 = new Movies() { Title = "title2", Director = "director2", Score = "score2", Type = "type2" };
    MoviesCol.Add(check1);
    MoviesCol.Add(check);
    dataGridMovies.ItemsSource = MoviesCol;
    MoviesCol.Add(check2);
}

并从constructor 初始化此MovieCol 属性。

MoviesCol = new ObservableCollection<Movies>();

【讨论】:

  • 感谢您的回答。但我有一个问题。我想稍后向 DataGrid/ListBox 添加更多电影,但它不起作用。似乎 var movies 设置为 DataGrid 的 ItemsSource(这没关系),但如果我稍后将更多电影添加到 var movie,则不会反映此更改。你能建议一些改变吗?
  • 如果答案是正确的。请标记为正确并标记。它可以帮助他人。
  • 谢谢,我一定会标记的。但这不是我想要的 100%。这就是为什么我问你上面的问题。我希望将 var movies 作为全局变量,每次将电影添加到 var movies 后,ItemsSource 也会更新。
  • 检查更新的答案。这会有所帮助。如果没有帮助,请告诉我。
  • @displayed_name,Deepak 提到了一些关于在构造函数中初始化集合的内容。您可以这样做,也可以使用自动属性初始化器,例如 public ObservableCollection&lt;Movies&gt; MoviesCol { get; set; } = new ObservableCollection&lt;Movies&gt;();。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2010-09-20
  • 2017-07-22
  • 1970-01-01
  • 2011-02-22
  • 2017-09-18
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多