我有两个组合框。如果我在第一个活动中选择一个活动,相关的子活动应该显示在第二个组合框中。按照MVVM风格,代码看起来很好,但是当我在第一次选择一个活动时,第二个组合框中的相关子活动没有同步。下面是我的代码:View
<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();
}
}ViewModel
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。我到处找人帮忙,但什么也找不到。如果有人能在代码中指定任何问题,我将非常高兴。
发布于 2013-02-15 16:13:34
我解决了我的问题。当活动发生更改时,应将更改通知相关的子活动。但是,当子活动被更改时,就不需要通知活动了。
我刚刚在CurrentSubActivity属性中注释了CurrentSubActivity()调用。这是代码
private int currentSubActivity;
public int CurrentSubActivity
{
get { return currentSubActivity; }
set
{
//OnPropertyChanged("CurrentSubActivity");
this.currentSubActivity = value;
}
}我希望这对外面的人也有帮助:)
发布于 2013-02-01 18:24:50
不要绑定到组合框中的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正在管理列表并知道所选项是哪个)。
希望这对你有帮助!问候
https://stackoverflow.com/questions/14651098
复制相似问题