我的数据库中有一个名为Groups的表,如下所示:

Groups
  |--GroupID
  |--GroupName
  |--ParentID
  |--NatureOfGroupID
  |--EffectID


这是上表的关系图:



我在一个有两列的窗口中有一个组合框。这是xaml:

<ComboBox ItemsSource="{Binding DataContext.GroupNamesWithCorrespondingEffects, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Page}}}"
          SelectedValue="{Binding ParentID}" SelectedValuePath="GroupID">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding GroupName}" Width="200" />
                <TextBlock Text="{Binding CorrespondingEffect}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>


实际上,我想显示GroupName及其对应的效果,但是当用户选择任何项时,我希望将SelectedValue作为ParentID。

这是GroupNameWithCorrespondingEffect.cs的实现

public class GroupNameWithCorrespondingEffect : MainViewModel
{
    private string _groupName;
    public string GroupName
    {
        get
        {
            return _groupName;
        }
        set
        {
            _groupName = value;
            OnPropertyChanged("GroupName");
        }
    }

    private string _correspondingEffect;
    public string CorrespondingEffect
    {
        get
        {
            return _correspondingEffect;
        }

        set
        {
            _correspondingEffect = value;
            OnPropertyChanged("CorrespondingEffect");
        }
    }
}


这是groupsViewModel.cs的代码

public class GroupsViewModel : MainViewModel
{
    public GroupsViewModel()
    {

        using (Entities db = new Entities())
        {
            GroupNamesWithCorrespondingEffects = (from g in db.Groups
                                                  select new GroupNameWithCorrespondingEffect
                                                  {
                                                      GroupName = g.GroupName,
                                                      CorrespondingEffect = g.Master_Effects.Effect
                                                  }).ToList();

            NaturesOfGroup = (from m in db.Master_NatureOfGroup
                              select m).ToList();
        }

        SaveChangesCommand = new RelayCommand(SaveGroup);

        CurrentGroup = new Group();
    }

    private Group _currentGroup;
    public Group CurrentGroup
    {
        get
        {
            return _currentGroup;
        }

        set
        {
            _currentGroup = value;
            OnPropertyChanged("CurrentGroup");
        }
    }

    private List<GroupNameWithCorrespondingEffect> _groupNamesWithCorrespondingEffects;
    public List<GroupNameWithCorrespondingEffect> GroupNamesWithCorrespondingEffects
    {
        get
        {
            return _groupNamesWithCorrespondingEffects;
        }
        set
        {
            _groupNamesWithCorrespondingEffects = value;
            OnPropertyChanged("GroupNamesWithCorrespondingEffects");
        }
    }

    private List<Master_NatureOfGroup> _naturesOfGroup;
    public List<Master_NatureOfGroup> NaturesOfGroup
    {
        get
        {
            return _naturesOfGroup;
        }
        set
        {
            _naturesOfGroup = value;
            OnPropertyChanged("NaturesOfGroup");
        }
    }

    public ICommand SaveChangesCommand { get; set; }

    private void SaveGroup(object obj)
    {
        Group cGroup = new Group()
        {
            GroupName = CurrentGroup.GroupName,
            **ParentID = CurrentGroup.ParentID,**
            NatureOfGroupID = CurrentGroup.NatureOfGroupID,
            EffectID = CurrentGroup.EffectID
        };

        using (Entities db = new Entities())
        {
            db.Groups.Add(cGroup);
            db.SaveChanges();

            GroupNamesWithCorrespondingEffects = (from g in db.Groups
                                                  select new GroupNameWithCorrespondingEffect
                                                  {
                                                      GroupName = g.GroupName,
                                                      CorrespondingEffect = g.Master_Effects.Effect
                                                  }).ToList();

        }
    }
}


当我调试并在标有** .... **的行上放置断点时,我总是得到CurrentGroup.ParentID = null。

更新:

<Page.DataContext>
    <vm:GroupsViewModel />
</Page.DataContext>

<Grid DataContext="{Binding CurrentGroup}">

    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="0.6*" />
        <ColumnDefinition Width="0.6*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Row="1" Grid.Column="1" Text="Name" HorizontalAlignment="Left"/>
    <TextBlock Grid.Row="1" Grid.Column="1" Text=" : " HorizontalAlignment="Right"/>
    <TextBox Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Text="{Binding GroupName}"/>

    <TextBlock Grid.Row="2" Grid.Column="1" Text="Under" HorizontalAlignment="Left"/>
    <TextBlock Grid.Row="2" Grid.Column="1" Text=" : " HorizontalAlignment="Right"/>
    <ComboBox x:Name="cbUnder" Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2"
              ItemsSource="{Binding DataContext.GroupNamesWithCorrespondingEffects, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Page}}}"
              SelectedValue="{Binding ParentID}" SelectedValuePath="GroupID">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding GroupName}" Width="200" />
                    <TextBlock Text="{Binding CorrespondingEffect}" />
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <TextBlock Grid.Row="3" Grid.Column="1" Text="Nature of Group" HorizontalAlignment="Left" Visibility="{Binding Visibility, ElementName=cbNature}"/>
    <TextBlock Grid.Row="3" Grid.Column="1" Text=" : " HorizontalAlignment="Right" Visibility="{Binding Visibility, ElementName=cbNature}"/>
    <ComboBox x:Name="cbNature" Grid.Row="3" Grid.Column="2" Visibility="{Binding SelectedIndex, Converter={StaticResource selectedIndexToVisibilityConverter}, ElementName=cbUnder}"
              ItemsSource="{Binding DataContext.NaturesOfGroup, RelativeSource={RelativeSource AncestorType={x:Type Page}}}" DisplayMemberPath="Nature"
              SelectedValue="{Binding NatureOfGroupID}" SelectedValuePath="NatureOfGroupID"/>

    <StackPanel Grid.Row="5" Grid.Column="4" Orientation="Horizontal">
        <Button Content="Save" Command="{Binding DataContext.SaveChangesCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Page}}}"/>
    </StackPanel>
</Grid>

最佳答案

我可以在您的代码中看到两个问题。

首先你提到


  实际上我想显示GroupName及其对应的效果,但是
  当用户选择任何项目时,我想获取SelectedValue作为
  ParentID。


但是在组合框声明中,您设置了SelectedValuePath="GroupID"。应将其设置为ParentID-SelectedValuePath="ParentID"



其次,即使将SelectedValuePath设置为ParentID,它也不起作用,因为combobox ItemsSource是GroupNameWithCorrespondingEffect的列表,其中没有任何属性ParentID

为了使SelectedValuePath工作,基础模型类应具有该属性,因此请创建一个属性,并像其他两个属性一样从数据库中填充它。

GroupNamesWithCorrespondingEffects = (from g in db.Groups
                             select new GroupNameWithCorrespondingEffect
                             {
                                GroupName = g.GroupName,
                                CorrespondingEffect = g.Master_Effects.Effect,
                                ParentID = g.ParentId
                             }).ToList();


因此,为了使您的解决方案起作用,您必须修复这两个问题。

关于c# - 多列组合框中的选定值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21860012/

10-12 14:54