Ответ 1
У меня для тебя плохие новости. Он должен работать. В другом месте есть ошибка/неожиданный побочный эффект, который вызывает вашу проблему.
Я собрал быстрый проект, чтобы сделать то, что вы пытаетесь сделать. Мне нравится видеть это здесь.
Создайте новый проект WPF под названием NestedProperties. Добавьте новый класс в корневой каталог и вставьте следующий код (я удалил много вещей, чтобы он был немного уродлив):
public sealed class ViewModel : DependencyObject
{
public ObservableCollection<Activity> Activities
{ get; private set; }
public ObservableCollection<ActivityStatus> Statuses
{ get; private set; }
public static readonly DependencyProperty
SelectedActivityProperty =
DependencyProperty.Register(
"SelectedActivity",
typeof(Activity),
typeof(ViewModel),
new UIPropertyMetadata(null));
public Activity SelectedActivity
{
get { return (Activity)GetValue(SelectedActivityProperty); }
set { SetValue(SelectedActivityProperty, value); }
}
public ViewModel()
{
Activities = new ObservableCollection<Activity>();
Statuses = new ObservableCollection<ActivityStatus>();
// NOTE! Each Activity has its own ActivityStatus instance.
// They have the same Guid and name as the instances in
// Statuses!!
for (int i = 1; i <= 4; i++)
{
var id = Guid.NewGuid();
var aname = "Activity " + i;
var sname = "Status " + i;
Activities.Add(new Activity
{
Name = aname,
Status = new ActivityStatus
{
Name = sname,
Id = id,
InstanceType = "Activity"
}
});
Statuses.Add(new ActivityStatus
{
Name = sname,
Id = id,
InstanceType = "Collection"
});
}
}
}
public sealed class Activity : DependencyObject
{
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register(
"Name",
typeof(string),
typeof(Activity),
new UIPropertyMetadata(null));
public string Name
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
}
public static readonly DependencyProperty StatusProperty =
DependencyProperty.Register(
"Status",
typeof(ActivityStatus),
typeof(Activity),
new UIPropertyMetadata(null));
public ActivityStatus Status
{
get { return (ActivityStatus)GetValue(StatusProperty); }
set { SetValue(StatusProperty, value); }
}
}
public sealed class ActivityStatus
{
public Guid Id { get; set; }
public string Name { get; set; }
/// <summary>
/// indicates if this instance came from
/// the ComboBox or from the Activity
/// </summary>
public string InstanceType { get; set; }
public ActivityStatus()
{
Id = Guid.NewGuid();
}
public override bool Equals(object otherObject)
{
if (!(otherObject is ActivityStatus)) return false;
return Equals(otherObject as ActivityStatus);
}
public bool Equals(ActivityStatus otherStatus)
{
if (!(otherStatus is ActivityStatus) ||
otherStatus == null) return false;
return Id == otherStatus.Id &&
Name == otherStatus.Name;
}
}
Теперь откройте MainWindow и вставьте это в:
<Window
x:Class="NestedProperties.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
xmlns:t="clr-namespace:NestedProperties"
SizeToContent="Height"
MaxHeight="350"
Width="525">
<Window.DataContext>
<t:ViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition
Height="auto" />
<RowDefinition
Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label>Select an Activity:</Label>
<ComboBox
Grid.Row="1"
ItemsSource="{Binding Activities}"
SelectedItem="{Binding SelectedActivity}"
DisplayMemberPath="Name" />
<Label
Grid.Column="1">Select a Status</Label>
<ComboBox
Grid.Row="1"
Grid.Column="1"
ItemsSource="{Binding Statuses}"
SelectedItem="{Binding SelectedActivity.Status}"
DisplayMemberPath="Name" />
<ContentControl
Grid.Row="2"
Grid.ColumnSpan="2"
Content="{Binding SelectedActivity}">
<ContentControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<Label>Selected Activity:</Label>
<TextBlock
Text="{Binding Name}" />
<Label>Activity Status</Label>
<TextBlock
Text="{Binding Status.Name}" />
<Label>Status Id</Label>
<TextBlock
Text="{Binding Status.Id}" />
<Label>Status came from</Label>
<TextBlock
Text="{Binding Status.InstanceType}" />
</StackPanel>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</Grid>
</Window>
Когда вы запустите это, вы обнаружите, что у вас есть четыре действия и четыре состояния. Если вы перейдете в комбинацию "Действия", вы увидите, что каждый статус отмечен как Активность, то есть это экземпляр, заданный для Activity в конструкторе ViewModel. Вы также увидите, что поле со списком статуса изменяется с изменением активности, что означает, что работает метод Equals
.
Затем измените статус для каждого действия. Вы увидите тип изменений статуса Коллекция, что означает, что этот экземпляр был создан и добавлен в коллекцию Statuses в конструкторе.
Так почему это работает, но ваш код не является? Я не уверен. Ваша проблема кроется в другом месте вашего кода.