首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库2组合框问题

数据库2组合框问题
EN

Stack Overflow用户
提问于 2013-02-01 16:47:18
回答 2查看 520关注 0票数 1

我有两个组合框。如果我在第一个活动中选择一个活动,相关的子活动应该显示在第二个组合框中。按照MVVM风格,代码看起来很好,但是当我在第一次选择一个活动时,第二个组合框中的相关子活动没有同步。下面是我的代码:View

代码语言:javascript
复制
<Window x:Class="TestDGCombosBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestDGCombosBinding"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <ObjectDataProvider x:Key="ActivitiesDataProvider" ObjectType="{x:Type local:Activities}" MethodName="GetActivities"/>
        <local:DebugConverter x:Key="DebugConverter" />
    </Grid.Resources>
    <DataGrid 
        Grid.Row="1" Grid.Column="1" 
                 AutoGenerateColumns="False"                     
                 SelectionUnit="CellOrRowHeader"
                 SelectionMode="Single"
                 IsSynchronizedWithCurrentItem="True" 
                 RowBackground="White" 
                 AlternatingRowBackground="LightGray"                                          
                 AlternationCount="2" Name="dataGrid1" CurrentCellChanged="dataGrid1_CurrentCellChanged">
        <DataGrid.BindingGroup>
            <BindingGroup />
        </DataGrid.BindingGroup>
        <DataGrid.Resources>

        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Activities Custom" CanUserSort="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding CurrentActivity}"                                       
                                    SelectedValuePath="ActivityID"                                        
                                    DisplayMemberPath="ActivityName"
                                    ItemsSource="{Binding Source={StaticResource ActivitiesDataProvider}}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="SubActivities Custom" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding CurrentSubActivity}"                                       
                                    SelectedValuePath="SubActivityID"                                      
                                    DisplayMemberPath="SubActivityname"
                                    ItemsSource="{Binding Path=SubActivitiesOfCurrentActivity}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>
    </DataGrid>
</Grid>

模型

代码语言:javascript
复制
public class Activities
{
    public DataView GetActivities()
    {
        return ActivitiesAccess.GetAllActivities();
    }
}

ViewModel

代码语言:javascript
复制
public class ActivitiesViewModel : INotifyPropertyChanged
{
    public ActivitiesViewModel()
    { }
    private int currentActivity;

    public int CurrentActivity
    {
        get { return currentActivity; }
        set { 
                currentActivity = value;
                SubActivitiesOfCurrentActivity = ActivitiesAccess.GetAllSubActivitiesinActivity(currentActivity);
                OnPropertyChanged("CurrentActivity");
            }
    }

    private DataView subActivitiesOfCurrentActivity;

    public DataView SubActivitiesOfCurrentActivity
    {
        get {return subActivitiesOfCurrentActivity; }
        set
        {
            subActivitiesOfCurrentActivity = value;
            OnPropertyChanged("SubActivitiesOfCurrentActivity");
        }
    }

    private int currentSubActivity;

    public int CurrentSubActivity
    {
        get { return currentSubActivity; }
        set
        {
            currentSubActivity = value;
            OnPropertyChanged("CurrentSubActivity");
            }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

当我从第一个下拉菜单中选择一个活动时,当我调试代码时,CurrentActivity属性值总是为0,我不知道为什么。此值应等于所选活动的ActivityID。我到处找人帮忙,但什么也找不到。如果有人能在代码中指定任何问题,我将非常高兴。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 16:13:34

我解决了我的问题。当活动发生更改时,应将更改通知相关的子活动。但是,当子活动被更改时,就不需要通知活动了。

我刚刚在CurrentSubActivity属性中注释了CurrentSubActivity()调用。这是代码

代码语言:javascript
复制
private int currentSubActivity;

    public int CurrentSubActivity
    {
        get { return currentSubActivity; }
        set
        {
            //OnPropertyChanged("CurrentSubActivity");
            this.currentSubActivity = value;

        }
    }

我希望这对外面的人也有帮助:)

票数 0
EN

Stack Overflow用户

发布于 2013-02-01 18:24:50

不要绑定到组合框中的Text属性,请尝试替换:

代码语言:javascript
复制
 <ComboBox Text="{Binding CurrentActivity}"                                       
                                SelectedValuePath="ActivityID"                                        
                                DisplayMemberPath="ActivityName"
                                ItemsSource="{Binding Source={StaticResource ActivitiesDataProvider}}"/>

通过以下方式:

代码语言:javascript
复制
<ComboBox ItemsSource="{Binding Source={StaticResource ActivitiesDataProvider}}"                                      
                                SelectedValuePath="ActivityID"                                        
                                DisplayMemberPath="ActivityName"
                                SelectedValue="{Binding CurrentActivity}"
                                IsSynchronizedWithCurrentItem="True"/>

子活动组合箱也有相同的想法。通常,对于组合框,使用SelectedItem和SelectedIndex属性。还可以使用IsSynchronizedWithCurrentItem (取决于ItemsSource的类型)。

顺便说一句,您不需要绑定到ID (如果不需要的话),您可以通过以下方法直接绑定到整个对象:

代码语言:javascript
复制
 SelectedValue="{Binding SelectedItem}"

它将组合框的值绑定到列表的选定项,只需使用IsSynchronizedWithCurrentItem="True“与VM保持同步即可(如果VM正在管理列表并知道所选项是哪个)。

希望这对你有帮助!问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14651098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档