gpt4 book ai didi

wpf - 将 ComboBox 绑定(bind)到 DataGrid 条目

转载 作者:行者123 更新时间:2023-12-01 14:59:32 34 4
gpt4 key购买 nike

解决了问题,但仍有疑问。请参阅帖子末尾,或继续阅读上下文。

我正在尝试设置一个 WPF 数据网格,其中包含许多带有组合框的模板列。特别是我在数据绑定(bind)方面遇到了麻烦。

数据模型
首先,我有 Entry ,其中包含 4 个属性:

  • Name
  • Customer
  • Color
  • Type

  • 最有趣的属性是 Color它还有两个子属性:
  • ColorString
  • Index

  • 目标
    我需要创建一个数据网格,其中每一行对应一个 Entry目的。 Customer、Color 和 Type 属性都有允许选择动态填充选项的组合框。我需要每个组合框的选定项目绑定(bind)到条目的各自属性。

    截图
    enter image description here

    问题:
    如何正确设置数据网格和每个组合框的数据上下文?
    对于数据网格,我以编程方式将数据上下文设置为 ObservableCollection 的一个实例。
    private ObservableCollection<Entry> entries = new ObservableCollection<Entry>();

    public MainWindow()
    {
    InitializeComponent();

    entries.Add(new Entry("Foo", "Customer1", new MyColor("#00000000", 1), "Type1"));
    entries.Add(new Entry("Bar", "Customer2", new MyColor("#00000000", 1), "Type2"));
    LayerMapGrid.DataContext = entries; //Set data-context of datagrid
    }

    对于颜色组合框,我使用 ObjectDataProvider在我的 XAML 中:
    <Window.Resources>
    <ObjectDataProvider x:Key="Colors" ObjectType="{x:Type local:MyColor}" MethodName="GetColors"/>
    </Window.Resources>

    这就是我绑定(bind) ObjectDataProvider 的方式
    <ComboBox ItemsSource="{Binding Source={StaticResource Colors}}"/>

    MyColor类,我创建了以下方法:
    public static ObservableCollection<MyColor> GetColors()
    {
    ObservableCollection<MyColor> colors = new ObservableCollection<MyColor>();
    //... Fill collection... (omitted for brevity)
    return colors;
    }

    好消息是上述所有代码都可以工作。然而,这是解决手头问题的好方法吗?

    这是我的下一个更重要的问题:
    如何绑定(bind)组合框的选定项,以便 ObservableCollection<Entry>更新了吗?

    我知道我需要设置 UpdateSourceTrigger="PropertyChanged" ,所以我的来源,即 Entry收藏已更新。

    这是我当前用于设置整个数据网格的 XAML 代码。注意:我还没有实现客户和类型组合框。我真的只关心颜色组合框:
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="LayerMapGrid">
    <DataGrid.Columns>

    <!--Name Column-->
    <DataGridTemplateColumn Header="Name">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <Label Content="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.HeaderStyle>
    <Style TargetType="DataGridColumnHeader">
    <Setter Property="Control.HorizontalContentAlignment" Value="Center" />
    </Style>
    </DataGridTemplateColumn.HeaderStyle>
    </DataGridTemplateColumn>

    <!--Customer Column-->
    <DataGridTemplateColumn Header="Customer">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <ComboBox SelectedItem="{Binding CustomerName, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <!--Color Column-->
    <DataGridTemplateColumn Header="Color">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <ComboBox ItemsSource="{Binding Source={StaticResource Colors}}" SelectedItem="{Binding Color, ElementName=LayerMapGrid, UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.ItemTemplate>
    <DataTemplate>
    <DockPanel Margin="2">
    <Border DockPanel.Dock="Left" HorizontalAlignment="Right" BorderThickness="1" BorderBrush="Black" Margin="1" Width="10" Height="10">
    <Rectangle Name="ColorRec" Fill="{Binding ColorString}"/>
    </Border>
    <TextBlock Padding="4,2,2,2" Text="{Binding ColorString}" VerticalAlignment="Center"/>
    </DockPanel>
    </DataTemplate>
    </ComboBox.ItemTemplate>
    </ComboBox>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <!--Type Column-->
    <DataGridTemplateColumn Header="Type">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <ComboBox SelectedItem="{Binding Type, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    </DataGrid.Columns>
    </DataGrid>

    非常感谢您的帮助。我已经用这个把头撞在墙上了大约 16 个小时。

    -尼克米勒

    编辑:
    我找到了解决方案(并且总是在请求帮助后立即找到),但我不明白它是如何工作的。

    在 XAML 中,我将组合框绑定(bind)更改为以下内容:
    <ComboBox ItemsSource="{Binding Source={StaticResource Colors}}" SelectedItem="{Binding Color, UpdateSourceTrigger=PropertyChanged}">

    这里到底发生了什么?

    为什么组合框现在指的是数据网格的数据上下文?当我将 ItemsSource 设置为指向我的 ObjectDataProvider 时,这不会被覆盖吗? ?

    最佳答案

    How do I properly set the data contexts for the data grid and for each combobox?



    你没有。通常在 WPF 中,我们设置 DataContext UserControl 上的属性(property), 或 Window我们正在设计的,而不是单独的控制。这样, View 中的所有控件都可以访问数据属性。

    How do I bind the selected items of the comboboxes so that ObservableCollection is updated?



    同样,你不做你正在做的事。而不是使用 ObjectDataProvider , 你应该只拥有 ObservableCollection<MyColor> 类型的属性在后面的代码中并直接绑定(bind)到它。你应该绑定(bind)一个 public Entries DataGrid.ItemsSource 的属性(property)属性,不设置 private entries字段为 DataContext .你真的需要通读 Data Binding Overview MSDN 上的页面以获得更多帮助。

    设置 DataContextMainWindow.xaml对自己(这通常不是一个好主意):
    public MainWindow()
    {
    InitializeComponent();

    Entries.Add(new Entry("Foo", "Customer1", new MyColor("#00000000", 1), "Type1"));
    Entries.Add(new Entry("Bar", "Customer2", new MyColor("#00000000", 1), "Type2"));
    DataContext = this; //Set DataContext to itself so you can access properties here
    }

    然后在 MainWindow.xaml :
    <DataGrid ItemsSource="{Binding Entries}" ... />
    DataTemplate DataGrid 的每一行中的 s自动将数据绑定(bind)集合中的相关项设置为 DataContext ,因此您可以自动访问相关类的属性。再次...无需设置任何 DataContext s 手动。如果您还有其他问题,请阅读链接的文章,因为答案就在那里。

    更新>>>

    让我们澄清一些事情......我不是你的私有(private)导师,所以这将是我最后的回复。

    How do I overcome the combobox inheriting the data context of the data grid?



    将数据绑定(bind)到设置为 Window.DataContext 的对象,您只需要使用有效的 Binding Path和一些基本逻辑:
    <ComboBox ItemsSource="{Binding DataContext.MyColors, RelativeSource={RelativeSource 
    AncestorType={x:Type YourLocalPrefix:MainWindow}}}" />

    关于wpf - 将 ComboBox 绑定(bind)到 DataGrid 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745616/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com