1

私は2つのコンボボックスを持っています。最初のアクティビティでアクティビティを選択すると、関連するサブアクティビティが2番目のコンボボックスに表示されます。コードは MVVM スタイルに従って問題ないように見えますが、最初のアクティビティでアクティビティを選択すると、2 番目のコンボボックスの関連するサブアクティビティが同期されません。ここに私のコードがあります :

<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

問題を解決しました。アクティビティが変更されると、関連するサブアクティビティに変更が通知されます。ただし、サブアクティビティが変更された場合、アクティビティに通知する必要はありません。

CurrentSubActivity プロパティの OnPropertyChanged() 呼び出しにコメントしました。ここにコードがあります

private int currentSubActivity;

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

        }
    }

これが誰かにも役立つことを願っています:)

于 2013-02-15T16:13:34.520 に答える
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 がリストを管理していて、選択されたアイテムがどれであるかを認識している場合に適用されます)。

これがお役に立てば幸いです!よろしく

于 2013-02-01T18:24:50.553 に答える