0

以下の XAML を定義しました。バインディングによって DataGridComboBoxColumn が設定されました。コンボ ボックスで PartNumber を選択した場合、別のプロパティ (PartName) の値を DataGridTextColumn でバインドする必要があります。DataGridTextColumn でそのバインディングを行うにはどうすればよいですか?

<Window.Resources>
  <ObjectDataProvider x:Key="RecordValues"
                      ObjectType="{x:Type local:RecordTemp}"
                      MethodName="GetPersonList">
  </ObjectDataProvider>
</Window.Resources>
<Grid>
  <Grid>
    <DataGrid AutoGenerateColumns="False"
              ItemsSource="{Binding}"
              Margin="10"
              Name="dataGrid1">
      <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Combo"
                                Width="300"
                                SelectedItemBinding="{Binding Values}"
                                DisplayMemberPath="PartNumber"
                                ItemsSource="{Binding Source={StaticResource RecordValues}}" />
        <DataGridTextColumn Header="Order Name"
                            Binding="" />
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Grid>

以下のコードで定義されている C# では、

    ObservableCollection<RecordTemp> RecordsTemp = new ObservableCollection<RecordTemp>();

    RecordsTemp.Add(new RecordTemp());
    RecordsTemp.Add(new RecordTemp());
    dataGrid1.DataContext = RecordsTemp;  


   public class RecordTemp
    {
    List<PartsList> _value = new List<PartsList>();

       public RecordTemp()
    {
        _value.Add(new PartsList() { PartName = "One", PartNumber = "1", PartQuantity = 20 });
        _value.Add(new PartsList() { PartName = "Two", PartNumber = "2", PartQuantity = 10 });
    }

    public List<PartsList> value
    {
        get { return _value; }
        set { _value = value; }
    }

    public List<PartsList> GetPersonList()
    {
        return _value;
    }
    }

public class PartsList
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        public string PartNumber { get; set; }
    }
4

1 に答える 1

1

これを達成する1つの方法は

  1. 選択したPartListobjを格納するRecordTempクラスに新しいプロパティ(たとえば、プロパティ名がSelectedPart)を追加します。

  2. SelectedPartプロパティをComboBoxのSelectedValueプロパティにバインドします。

  3. SelectedPartをテキストボックスにバインドします。

  4. ここで、RecordTempクラスはINotifyPropertyChangedインターフェイスを実装して、ユーザーがComboBox値を変更したときにUIが更新されるようにする必要があります。

これが私があなたのコードに行った変更です。

<DataGrid AutoGenerateColumns="False"
          ItemsSource="{Binding}"
          Margin="10"
          Name="dataGrid1"
          CanUserAddRows="False">
  <DataGrid.Columns>
    <DataGridTemplateColumn Header="Combo">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <ComboBox SelectedValue="{Binding SelectedPart, UpdateSourceTrigger=PropertyChanged}"
                    DisplayMemberPath="PartNumber"
                    ItemsSource="{Binding Source={StaticResource RecordValues}}" />
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Header="Order Name"
                        Binding="{Binding SelectedPart.PartName}" />
  </DataGrid.Columns>
</DataGrid>

ファイルの背後にあるコード。名前空間を変更する必要がある場合があります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ObservableCollection<RecordTemp> RecordsTemp = new ObservableCollection<RecordTemp>();

            RecordsTemp.Add(new RecordTemp());
            RecordsTemp.Add(new RecordTemp());
            dataGrid1.DataContext = RecordsTemp;
        }
    }

    public class RecordTemp : INotifyPropertyChanged
    {
        List<PartsList> _value = new List<PartsList>();

        public RecordTemp()
        {
            _value.Add(new PartsList() { PartName = "One", PartNumber = "1", PartQuantity = 20 });
            _value.Add(new PartsList() { PartName = "Two", PartNumber = "2", PartQuantity = 10 });
        }

        public List<PartsList> value
        {
            get { return _value; }
            set { _value = value; }
        }

        private PartsList _SelectedPart;

        public PartsList SelectedPart
        {
            get { return _SelectedPart; }
            set
            {
                _SelectedPart = value;
                OnPropertyChanged("SelectedPart");
            }
        }

        public List<PartsList> GetPersonList()
        {
            return _value;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class PartsList
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        public string PartNumber { get; set; }
    }
}
于 2013-01-23T15:24:06.530 に答える