【问题标题】:From XAML to C#. How to add DataGrid to WrapPanel that corresponds the one in XAML?从 XAML 到 C#。如何将 DataGrid 添加到与 XAML 中对应的 WrapPanel?
【发布时间】:2013-08-26 15:50:59
【问题描述】:

我正在尝试使用与 XAML 中对应的绑定创建 DataGrid。

 <WrapPanel Orientation="Vertical" Name="myWrapPanel" Margin="20,120,20,0">
    <DataGrid BorderBrush="{x:Null}" Name="myDataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" AlternatingRowBackground="#8A2BE2" RowBackground="#FFA40000" Background="{x:Null}" CanUserAddRows="False" CanUserDeleteRows="True" HeadersVisibility="None" HorizontalAlignment="Left" Width="340" >
                <DataGrid.Columns>
                <DataGridTemplateColumn Width="10">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Path=one, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="4*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" HorizontalAlignment="Left" Name="TAG" Text="{Binding Path=two}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="5*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=three, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Right" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </WrapPanel>

不幸的是,动态创建的并不相同。 复选框看起来不同,边距不正确。 到目前为止,这是我的代码:

        DataGrid myDataGrid2 = new DataGrid();
        myDataGrid2.AutoGenerateColumns = false;
        myDataGrid2.AlternatingRowBackground = (Brush)(new BrushConverter().ConvertFrom("#8A2BE2"));
        myDataGrid2.RowBackground = (Brush)(new BrushConverter().ConvertFrom("#FFA40000"));
        myDataGrid2.CanUserAddRows = false;
        myDataGrid2.CanUserDeleteRows = true;
        myDataGrid2.HeadersVisibility = DataGridHeadersVisibility.None;
        myDataGrid2.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
        myDataGrid2.BorderThickness = new Thickness(0);

        Binding one = new Binding();
        one.Path = new PropertyPath("one");
        one.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        one.Mode = BindingMode.TwoWay;

        DataGridCheckBoxColumn One = new DataGridCheckBoxColumn();
        One.Width = 10;
        One.Binding = one;

        Binding two = new Binding();
        two.Path = new PropertyPath("two");
        two.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        two.Mode = BindingMode.OneWay;

        DataGridTextColumn Two = new DataGridTextColumn();
        Two.Width = new DataGridLength(4, DataGridLengthUnitType.Star);
        Two.Binding = two;

        Binding three = new Binding();
        three.Path = new PropertyPath("three");
        three.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        three.Mode = BindingMode.TwoWay;

        DataGridTextColumn Three = new DataGridTextColumn();
        Three.Width = new DataGridLength(5, DataGridLengthUnitType.Star);
        Three.Binding = three;

        myDataGrid2.Width = this.Width - 40;
        myDataGrid2.Height = myDataGrid2.RowHeight * myDataGrid2.Items.Count + 20;

        myDataGrid2.Columns.Add(One);
        myDataGrid2.Columns.Add(Two);
        myDataGrid2.Columns.Add(Three);
        myWrapPanel.Children.Add(myDataGrid2);

        myDataGrid2.ItemsSource = new ObservableCollection<Driver>(driver);

这是我在 WPF 中的第一个应用程序。 有什么帮助吗?

Bindig 效果很好,只有视觉效果才是问题。 http://imageshack.us/photo/my-images/194/8iok.png/ 正如您在图像上看到的,上半部分是 XAML,下半部分是 C#。 我想在一些线程结束后动态添加一些数据。 这是重点。

【问题讨论】:

  • 你为什么要尝试用代码编写它?在普通的 WPF 应用程序中这样做是非常罕见的。

标签: c# wpf xaml


【解决方案1】:

我可能会创建一个设置了属性的Style,然后将其用于myDataGridmyDataGrid2。例如。类似于:

// in current file's Resources section
<Style x:Key="MyDataGridStyle">
    <Setter Property="BorderBrush" Value="{x:Null}" />
    // other stuff...
    <Setter Property="Columns">
        <Setter.Value>
                <DataGridTemplateColumn Width="10">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Path=one, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="4*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" HorizontalAlignment="Left" Name="TAG" Text="{Binding Path=two}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="5*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=three, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Right" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
        </Setter.Value>
    </Setter>
 </Style>


 <WrapPanel Orientation="Vertical" Name="myWrapPanel" Margin="20,120,20,0">
    <DataGrid Name="myDataGrid" Style="{StaticResource MyDataGridStyle}" />
 </WrapPanel>

DataGrid myDataGrid2 = new DataGrid();
myDataGrid2.Style = (Style)this.Resources["MyDataGridStyle"];

【讨论】:

    【解决方案2】:

    什么不工作? 绑定?可视化的数据网格?

    请更具体。

    从我在您的代码中看到的一切看起来都是正确的。 您可以尝试手动添加项目(手动将它们添加到 myDataGrid2.Items)吗?

    此外,双向索引也存在一些问题,这可能是您的情况(请参阅WPF - Programatically Binding to DataGridCheckBoxColumn

    【讨论】:

    • Bindig 效果很好,只有视觉效果才是问题。 link 如图所示,上半部分是 XAML,下半部分是 C#。
    • 可能是蒂姆 S. 回答的风格问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2011-06-25
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多