简体   繁体   English

如何使用MVVM在带有WPF C#的Datagrid ComboBox中显示和选择项目

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

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. 我希望能够从wpf Datagrid内的ComboBox中选择“ true”或“ false”(布尔值),并将该选择保存到我的数据库中。

I want to be able to indicate inside of a column if the row is "Active" or not through a boolean variable saved to my database as a bit(1 = true; 0 = false). 我希望能够通过以位形式保存到我的数据库中的布尔变量(1 = true; 0 = false)来指示该列是否处于“活动”状态。

Here is my create table statement: Create Table Statement(AccountType) 这是我的创建表语句: Create Table Statement(AccountType)

I populate the datagrid using an ObservableCollection as follows: 我使用ObservableCollection填充datagrid,如下所示:

protected override void Get()
{
    using (var dbContext = new IEMASEntitiesDataContext())
    {
        var accountType = from s in dbContext.AccountTypes select s;
        var observable = new  ObservableCollection<AccountType>(accountType);

        Collection = observable;
    }
}

My XAML code is as follows: 我的XAML代码如下:

<DockPanel DataContext="{StaticResource ResourceKey=AccountTypeViewModel}" LastChildFill="True">
    <ToolBar DockPanel.Dock="Top">
        <Button Content="Display"  Command="{Binding GetCommand}" Width="78"/>
        <Button Content="Save" Command="{Binding SaveCommand}" Width="78"/>
    </ToolBar>

    <Grid>
        <GroupBox x:Name="AccountTypeGroupBox">
            <DataGrid x:Name="DataGridAccountType" ItemsSource="{Binding Collection}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn  Header="AccountType" Width="150" Binding="{Binding Path=AccountTypeName, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                    <DataGridComboBoxColumn  Header="Active" Width="100" SelectedValueBinding="{Binding StatusList, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="AccountTypeId" DisplayMemberPath="Active"/>                   
                    <DataGridTemplateColumn Width="50" Header="Delete">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button x:Name="btnDelete" Content="Delete" Command="{Binding DeleteCommand}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </GroupBox>          
    </Grid>
</DockPanel>

It doesn't work. 没用 Nothing displays within the comboboxes, and I don't know how to save the selected item to the SQL Server database when it does display. 组合框中没有任何显示,而且在显示时,我也不知道如何将所选项目保存到SQL Server数据库中。 I'd appreciate some help, please. 请帮忙。 I am using LINQ TO SQL. 我正在使用LINQ TO SQL。 I am a newbie :-(. 我是新手:-(。

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. 据我了解,问题在于如何将一些XAML资源作为组合ItemsSource绑定,以及如何将组合的选定值绑定到DataGrid行后面的模型。 1. List item: 1.清单项目:

<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: DataGrid视图模型:

     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 DataGridMainDataContext(){集合=新的ObservableCollection(新列表{新的UserData {UName =“ Greg”,IsActive = false,},新的UserData {UName =“ Joe”,IsActive = false,},新的UserData {UName =“ Iv“,IsActive = false,}});

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

    } }

  2. Models: public class UserData : BaseObservableObject { private string _uName; 模型:公共类UserData:BaseObservableObject {私有字符串_uName; private object _countryData; 私有对象_countryData; private bool _isActive; 私人布尔值_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; 公共类ActivityStatus:BaseObservableObject {private bool _boolStatus; private string _verbalStatus; 私有字符串_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; 公共类国家:BaseObservableObject {私有字符串_countryName; private string _countryPop; 私人字串_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, 问候,

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM