ObservableCollection更改值会在同一DataGrid行上分配不同的值

时间:2014-04-14 08:35:51

标签: c# wpf xaml datagrid observablecollection

我想知道在引发comboBox的SelectionChanged事件时是否可以为datagrid列赋值?

例如,

在DataGrid中的一个ComboBox中我有2个值" 0"和" 1"

如果用户选择" 0" - 网格内的另一列和名为ID的同一行将显示" 0"那么如果用户决定选择" 1"然后,同一行中的ID将更改为" 1"

另一件事是我已将这些数据放在ObservableCollection中,所以基本上如果组合为0,那么我需要从ObservableCollection中获取ID为0。

我希望这是可以理解的。

------代码-------

        <DataGrid.Columns>
            <DataGridComboBoxColumn SelectedValueBinding="{Binding CID}" SelectedValuePath="CID"  Header="CID" Width="70">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">

                        <!--<EventSetter Event="SelectionChanged" Handler="abc"></EventSetter>-->


                        <Setter Property="ItemsSource"
                Value="{Binding DataContext.EntityCollection, 
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                                    AncestorType=Window}}"/>
                        <Setter Property="DisplayMemberPath" Value="CID"/>

                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource"
                Value="{Binding DataContext.EntityCollection,
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                                     AncestorType=Window}}"/>
                        <Setter Property="DisplayMemberPath" Value="CID"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>

                <DataGridComboBoxColumn.HeaderStyle>
                    <Style TargetType="{x:Type DataGridColumnHeader}">
                        <Setter Property="HorizontalContentAlignment"
                            Value="Center" />
                    </Style>
                </DataGridComboBoxColumn.HeaderStyle>
            </DataGridComboBoxColumn>

              <DataGridTextColumn Header="UID" Binding="{Binding EntityCollection.UID}" Width="70">
            </DataGridTextColumn>

基本上,我想要&#34; UID&#34; TextColumn将更新为用户在CID组合框中选择的ID中的ID。

干杯

2 个答案:

答案 0 :(得分:0)

将ComboBox的SelectedItem属性设置为与名为SelectedItem的成员绑定:

<DataGridComboBoxColumn SelectedValueBinding="{Binding CID}" SelectedItem="{Binding SelectedItem}" SelectedValuePath="CID"  Header="CID" Width="70">

然后设置一个名为SelectedItem的成员,如下所示:

private int _selectedItem;
public int SelectedItem
{
   get { return _selectedItem; }
   set
      {
         _selectedItem = value;
         OnPropertyChanged("SelectedItem");
      }
}

然后在TextBox中,将绑定设置为SelectedItem:

 <DataGridTextColumn Header="UID" Binding="{Binding SelectedItem.UID}" Width="70">
            </DataGridTextColumn>

答案 1 :(得分:0)

将一个集合绑定到Datagrid combox列,并使用组合框中的选定项绑定另一个数据网格文本列。

<强> XAML

<Window x:Class="ComboBoxDGWPF.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ComboBox DataGrid WPF" Height="300" Width="616"
        xmlns:staticData="clr-namespace:ComboBoxDGWPF"
        xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit">

<Window.Resources>
    <staticData:StatusList x:Key="StatusList"/>
</Window.Resources>

<Grid>
    <controls:DataGrid x:Name="dgData" AutoGenerateColumns="False">
        <controls:DataGrid.Columns>
            <controls:DataGridTemplateColumn Header="Status" Width="100">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Status}"/>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
                <controls:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox Height="22" ItemsSource="{StaticResource StatusList}" SelectedItem="{Binding Status}"/>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellEditingTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTextColumn Binding="{Binding Status}" Header="Selected Status" Width="100"/>
        </controls:DataGrid.Columns>
    </controls:DataGrid>
</Grid>
</Window>

代码背后

using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace ComboBoxDGWPF
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List<TicketInfo> ticketsList = new List<TicketInfo> 
            {
                new TicketInfo{ Status="Open"},
                new TicketInfo{ Status="Assigned"},
                new TicketInfo{ Status="Open"},
                new TicketInfo{ Status="Open"},
                new TicketInfo{ Status="Closed"},
                new TicketInfo{ Status="Open"},
                new TicketInfo{ Status="Open"}
            };
            dgData.ItemsSource = ticketsList;
        }
    }

    public class TicketInfo
    {
        public string Status { get; set; }
    }

    public class StatusList : List<string>
    {
        public StatusList()
        {
            this.Add("Assigned");
            this.Add("Closed");
            this.Add("In Progress");
            this.Add("Open");
            this.Add("Resolved");
        }
    }
}

类似文章发表Here