-1

I am using a UserControl within a UserControl. Everything works except one piece. I get:

BindingExpression path error: 'SelectedItem' property not found on 'object' ''OrganizationDetailsVM' (HashCode=21529561)'. BindingExpression:Path=SelectedItem; DataItem='OrganizationDetailsVM' (HashCode=21529561); target element is 'ExtendedTreeView' (Name='tvApplications'); target property is 'SelectedItem_' (type 'Object')

Here are the relevant bits:

OrganizationDetailsVM.cs

        private AdoptionApplication selectedApplication;
        public AdoptionApplication SelectedApplication
        {
            get { return this.selectedApplication; }
            set
            {
                if (this.selectedApplication != value)
                {
                    this.selectedApplication = value;
                    RaisePropertyChanged("SelectedApplication");
                }
            }
        }

        private object selectedTreeItem;
        public object SelectedTreeItem
        {
            get { return this.selectedTreeItem; }
            set
            {
                if (this.selectedTreeItem != value)
                {
                    this.selectedTreeItem = value;
                    SelectedApplication = selectedTreeItem as AdoptionApplication;
                    RaisePropertyChanged("SelectedTreeItem");
                    RaisePropertyChanged("SelectedApplication");
                }
            }
        }
        // other stuff

OrganizationDetails.xaml

 <uc:ApplicationsControl x:Name="ucApplications" SelectedItem="{Binding SelectedTreeItem}"
                         AddApplicationCommand="{Binding AddApplicationCommand}"
                         EditApplicationCommand="{Binding EditApplicationCommand}"
                         DeleteApplicationCommand="{Binding DeleteApplicationCommand}"/>

ApplicationsControl.xaml

<UserControl x:Class="CareerChanges.Views.UserControls.ApplicationsControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:cc="clr-namespace:CareerChanges"
             xmlns:local="clr-namespace:CareerChanges.Views.UserControls"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <cc:SimpleFolderConverter x:Key="folderConverter"/>
    </UserControl.Resources>
    <Grid Background="#FFE5E5E5"
          Loaded="Grid_Loaded">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="419*"/>
            <ColumnDefinition Width="75*"/>
        </Grid.ColumnDefinitions>
        <local:ExtendedTreeView x:Name="tvApplications"
                  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                  SelectedItem_="{Binding Path=SelectedItem, Mode=TwoWay, ValidatesOnNotifyDataErrors=True}"
                  ItemsSource="{Binding AdoptionApplications}">
            <local:ExtendedTreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type cc:AdoptionApplication}">
                    <HierarchicalDataTemplate.ItemsSource>
                        <MultiBinding Converter="{StaticResource folderConverter}" ConverterParameter=", Breeds, FamilyMembers, Persons">
                            <Binding Path="Organization"/>
                            <Binding Path="ApplicationPreferences"/>
                            <Binding Path="FamilyMembers"/>
                            <Binding Path="ApplicationPersons"/>
                        </MultiBinding>
                    </HierarchicalDataTemplate.ItemsSource>
                    <StackPanel Orientation="Horizontal" Background="Aquamarine">
                        <TextBlock Text="Application (" />
                        <TextBlock Text="{Binding Path=ApplicationID}"/>
                        <TextBlock Text=") "/>
                        <TextBlock Text="{Binding Path=Title}" FontStyle="Italic"/>
                        <TextBlock Text=" "/>
                        <TextBlock Text="{Binding Path=ApplicationDate, StringFormat=dd-MMM-yyyy}"/>
                        <TextBlock Text=" "/>
                        <TextBlock Text="{Binding ApplicationStatusID, Converter={StaticResource ApplicationStatusConverter}}"/>
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type cc:ApplicationPreference}" ItemsSource="{Binding Path=Colours}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding BreedID, Converter={StaticResource BreedConverter}}" />
                        <TextBlock Text=" [" Foreground="Blue" />
                        <TextBlock Text="{Binding Colours.Count}" Foreground="Blue" />
                        <TextBlock Text="]" Foreground="Blue" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type cc:FolderItem}"
                              ItemsSource="{Binding Path=Items}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Name="txtName" Text="{Binding Path=Name}" />
                        <TextBlock Text=" [" Foreground="Blue" />
                        <TextBlock Text="{Binding Items.Count}" Foreground="Blue" />
                        <TextBlock Text="]" Foreground="Blue" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type cc:Person}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Given}" />
                        <TextBlock Text=" " />
                        <TextBlock Text="{Binding Path=Surname}" />
                    </StackPanel>
                </DataTemplate>
                <DataTemplate DataType="{x:Type cc:FamilyMemberType}">
                    <TextBlock Text="{Binding Path=FamilyMemberTypeID, Converter={StaticResource FamilyTypeConverter}}"/>
                </DataTemplate>
                <DataTemplate DataType="{x:Type cc:ColourPreference}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="20"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <StackPanel Grid.Column="0" Orientation="Horizontal">
                            <TextBlock Text="{Binding ColourID, Converter={StaticResource ColourConverter}}" />
                        </StackPanel>

                        <StackPanel Grid.Column="1" Orientation="Horizontal">
                            <TextBlock Text=" Male: "/>
                            <CheckBox IsChecked="{Binding Male}" IsEnabled="False"/>
                            <TextBlock Text=" Female: "/>
                            <CheckBox IsChecked="{Binding Female}" IsEnabled="False"/>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
                <DataTemplate DataType="{x:Type cc:Organization}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Organization: " />
                        <TextBlock Text="{Binding Path=OrganizationName}" />
                    </StackPanel>
                </DataTemplate>
            </local:ExtendedTreeView.Resources>
        </local:ExtendedTreeView>
        <StackPanel Grid.Column="1">
            <Button Name="btnAddApplication" Margin="2" Command="{Binding Path=AddApplicationCommand}">Add</Button>
            <Button Name="btnEditApplication" Margin="2" Command="{Binding Path=EditApplicationCommand}">Edit</Button>
            <Button Name="btnDeleteApplication" Margin="2" Command="{Binding Path=DeleteApplicationCommand}">Delete</Button>
        </StackPanel>
    </Grid>
</UserControl>

ApplicationsControl.xaml.cs

        public object SelectedItem
        {
            get { return GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        public static readonly DependencyProperty SelectedItemProperty =
           DependencyProperty.Register(
               "SelectedItem",
               typeof(object),
               typeof(ApplicationsControl),
               new FrameworkPropertyMetadata(
                   null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

Finally, this is the code for the ExtendedTreeView from this question: Data binding to SelectedItem in a WPF Treeview

ExtendedTreeView.cs

    public class ExtendedTreeView : TreeView
    {
        public ExtendedTreeView()
            : base()
        {
            this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
        }

        void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (SelectedItem != null)
            {
                SetValue(SelectedItem_Property, SelectedItem);
            }
        }

        public object SelectedItem_
        {
            get { return (object)GetValue(SelectedItem_Property); }
            set { SetValue(SelectedItem_Property, value); }
        }
        public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
    }

For some reason, the binding isn't making it from OrganizationDetailsVM, through OrganizationDetails.xaml to ApplicationsControl.xaml and down to ExtendedTreeview. All the other bindings work perfectly. The tree view does what it should, except for binding to the selected item.

To sum up, I'm having a problem getting from here:

 <uc:ApplicationsControl x:Name="ucApplications" SelectedItem="{Binding SelectedTreeItem}"
                         AddApplicationCommand="{Binding AddApplicationCommand}"
                         EditApplicationCommand="{Binding EditApplicationCommand}"
                         DeleteApplicationCommand="{Binding DeleteApplicationCommand}"/>

... to here:

<local:ExtendedTreeView x:Name="tvApplications"
                        HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                        SelectedItem_="{Binding Path=SelectedItem, Mode=TwoWay, ValidatesOnNotifyDataErrors=True}"
                        ItemsSource="{Binding AdoptionApplications}">

It boils down to this binding not working:

SelectedItem_="{Binding Path=SelectedItem, Mode=TwoWay, ValidatesOnNotifyDataErrors=True}"
Cfun
  • 8,442
  • 4
  • 30
  • 62
DrTom
  • 29
  • 1
  • 7

1 Answers1

0

Found it! I'm still new at data binding. After looking at some other code, I modified the binding to:

SelectedItem="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:DogPersonsControl}}}">
DrTom
  • 29
  • 1
  • 7