How to Display and select items in a Datagrid ComboBox with WPF C#, using MVVM

后端 未结 1 666
时光取名叫无心
时光取名叫无心 2021-01-17 05:58

I want to be able to choose either \"true\" or \"false\"(boolean) from a ComboBox that is within a wpf Datagrid and be able to save that choice to my database.

I wan

相关标签:
1条回答
  • 2021-01-17 06:13

    As I can understand the problem is how to bind some XAML resource as a combo ItemsSource and in addtion how to binnd the selected value of a combo to the model behind the DataGrid row. 1. List item:

    <Window x:Class="SoDataGridProjectsHelpAttempt.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:soDataGridProjectsHelpAttempt="clr-namespace:SoDataGridProjectsHelpAttempt"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <x:Array x:Key="CountriesArray" Type="soDataGridProjectsHelpAttempt:Country">
            <soDataGridProjectsHelpAttempt:Country CountryName="Germany" CountryPop="150k"/>
            <soDataGridProjectsHelpAttempt:Country CountryName="France" CountryPop="125k"/>
            <soDataGridProjectsHelpAttempt:Country CountryName="Belarus" CountryPop="165k"/>
        </x:Array>
        <x:Array x:Key="StatusArray" Type="soDataGridProjectsHelpAttempt:ActivityStatus">
            <soDataGridProjectsHelpAttempt:ActivityStatus VerbalStatus="Yes" BoolStatus="True"/>
            <soDataGridProjectsHelpAttempt:ActivityStatus VerbalStatus="No" BoolStatus="False"/>
        </x:Array>
    </Window.Resources>
    <Window.DataContext>
        <soDataGridProjectsHelpAttempt:DataGridMainDataContext/>
    </Window.DataContext>
    <Grid>
        <DataGrid ItemsSource="{Binding Collection}" AutoGenerateColumns="False" CanUserAddRows="True">
            <DataGrid.Columns>
                <DataGridTextColumn     Width="Auto" Binding="{Binding UName}"/>
                <DataGridComboBoxColumn Header="Country" DisplayMemberPath="CountryName"
                                        ItemsSource="{StaticResource CountriesArray}" Width="Auto"
                                        SelectedItemBinding="{Binding CountryData}"/>
                <!--<DataGridComboBoxColumn Header="ActivityStatus" Width="Auto" ItemsSource="{StaticResource StatusArray}" 
                                        SelectedValueBinding="{Binding IsActive}" SelectedValuePath="BoolStatus" DisplayMemberPath="VerbalStatus"/>-->
                <DataGridComboBoxColumn Header="ActivityStatus" SelectedItemBinding="{Binding IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    <DataGridComboBoxColumn.ItemsSource>
                        <x:Array Type="system:Boolean">
                            <system:Boolean>True</system:Boolean>
                            <system:Boolean>False</system:Boolean>
                        </x:Array>
                    </DataGridComboBoxColumn.ItemsSource>
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    1. DataGrid viewmodel:

      public class DataGridMainDataContext
      

      { public DataGridMainDataContext() { Collection = new ObservableCollection(new List { new UserData { UName = "Greg", IsActive = false, }, new UserData { UName = "Joe", IsActive = false, }, new UserData { UName = "Iv", IsActive = false, } });

      }
      
      public ObservableCollection<UserData> Collection { get; set; }
      

      }

    2. Models: public class UserData : BaseObservableObject { private string _uName; private object _countryData; private bool _isActive;

      public bool IsActive
      {
          get { return _isActive; }
          set
          {
              _isActive = value;
              OnPropertyChanged();
          }
      }
      
      public string UName
      {
          get { return _uName; }
          set
          {
              _uName = value;
              OnPropertyChanged();
          }
      }
      
      public object CountryData
      {
          get { return _countryData; }
          set
          {
              _countryData = value;
              OnPropertyChanged();
          }
      }
      

      }

      public class ActivityStatus:BaseObservableObject { private bool _boolStatus; private string _verbalStatus;

      public bool BoolStatus
      {
          get { return _boolStatus; }
          set
          {
              _boolStatus = value;
              OnPropertyChanged();
          }
      }
      
      public string VerbalStatus
      {
          get { return _verbalStatus; }
          set
          {
              _verbalStatus = value;
              OnPropertyChanged();
          }
      }
      

      }

      public class Country : BaseObservableObject { private string _countryName; private string _countryPop;

      public string CountryName
      {
          get { return _countryName; }
          set
          {
              _countryName = value;
              OnPropertyChanged();
          }
      }
      
      public string CountryPop
      {
          get { return _countryPop; }
          set
          {
              _countryPop = value;
              OnPropertyChanged();
          }
      }
      
      public Country() { }
      public Country(string n, string d)
      {
          this.CountryName = n;
          this.CountryPop = d;
      }
      

      } Hope it will help you.

    regards,

    0 讨论(0)
提交回复
热议问题