1

我有 2 个组合框。如果我在第一个活动中选择一个活动,则相关的子活动应显示在第二个组合框中。根据 MVVM 样式,代码看起来不错,但是当我在第一个活动中选择一个活动时,第二个组合框中的相关子活动不会同步。这是我的代码: 查看

<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>


模型

public class Activities
{
    public DataView GetActivities()
    {
        return ActivitiesAccess.GetAllActivities();
    }
}

视图模型

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。我搜索了很多以寻求帮助,但我找不到任何东西。如果有人可以在代码中指定任何问题,我将非常高兴。

4

2 回答 2

0

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

 <ComboBox Text="{Binding CurrentActivity}"                                       
                                SelectedValuePath="ActivityID"                                        
                                DisplayMemberPath="ActivityName"
                                ItemsSource="{Binding Source={StaticResource ActivitiesDataProvider}}"/>

和:

<ComboBox ItemsSource="{Binding Source={StaticResource ActivitiesDataProvider}}"                                      
                                SelectedValuePath="ActivityID"                                        
                                DisplayMemberPath="ActivityName"
                                SelectedValue="{Binding CurrentActivity}"
                                IsSynchronizedWithCurrentItem="True"/>

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

顺便说一句,如果您不想绑定到 ID,则不需要绑定,您可以使用以下方法直接绑定到整个对象:

 SelectedValue="{Binding SelectedItem}"

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

希望这对你有帮助!问候

于 2013-02-01T18:24:50.553 回答
0

我解决了我的问题。当一个活动发生变化时,应该通知相关的子活动变化。但是当 Sub-Activity 发生变化时,不需要通知 Activity。

我刚刚在 CurrentSubActivity 属性中评论了 OnPropertyChanged() 调用。这是代码

private int currentSubActivity;

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

        }
    }

我希望这也可以帮助那里的人:)

于 2013-02-15T16:13:34.520 回答