多列组合框中的选定值

时间:2014-02-18 16:41:35

标签: c# wpf xaml combobox

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

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

以下是上表的关系图:

enter image description here

我在一个窗口中有一个组合框,我有两列。这是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及其相应的效果,但是当用户选择任何Item时,我想将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>

1 个答案:

答案 0 :(得分:1)

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

所有你提到的

第一次

  

其实我想显示GroupName及其相应的效果但是   当用户选择任何项目时,我想将SelectedValue作为   PARENTID。

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


第二次,即使您将SelectedValuePath设置为ParentID,也不会有效,因为组合框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();

因此,为了使您的解决方案能够解决这两个问题。