views:

230

answers:

1

I have a wpf app with the datacontext set to an instance of a viewmodel class. It all works fine except where I need to access a property of the viewmodel in a listbox with the datacontext set to a collection that is contained in the ViewModel class. On msdn it says you can escape using the \ character but that has not worked for me

My code

public class StatusBoardViewModel : INotifyPropertyChanged
   {
    OIConsoleDataContext db = new OIConsoleDataContext();

    // the collection
    private IQueryable<Issue> issues;
    public IQueryable<Issue> Issues
    {
        get 
        {
            // Lazy load issues if they have not been instantiated yet
            if (issues == null)
                QueryIssues(); // This just runs a linq query to set the property
            return issues; 
        }
        set
        {
            if (issues != value)
            {
                issues = value;
                OnPropertyChanged("Issues");
            }
        }
    }
    // The property I need to access
    private bool showDetailListItems = true;
    public bool ShowDetailListItems
    {
        get
        {
            return showDetailListItems;
        }
        set
        {
            if (showDetailListItems != value)
            {
                showDetailListItems = value;
                OnPropertyChanged("ShowDetailListItems");
            }
        }
    }
}

in the window1.xaml.cs

//instantiate the view model 
StatusBoardViewModel statusBoardViewModel = new StatusBoardViewModel();

    public Window1()
    {
        InitializeComponent();
        // setting the datacontext
        this.DataContext = statusBoardViewModel;
    }

And the Xaml

    // This is in the Window1.xaml file
    <ListBox x:Name="IssueListBox"
              ItemsSource="{Binding Issues}" // Binds the listbox to the collection in the ViewModel
              ItemTemplate="{StaticResource ShowIssueDetail}" 
              IsSynchronizedWithCurrentItem="True"
              HorizontalContentAlignment="Stretch" BorderThickness="3"
              DockPanel.Dock="Top" VerticalContentAlignment="Stretch" 
              Margin="2" MinHeight="50" />

// The datatemplate from the app.xaml file
    <DataTemplate x:Key="ShowIssueDetail">
        <Border CornerRadius="3" Margin="2" MinWidth="400" BorderThickness="2" 
                BorderBrush="{Binding Path=IssUrgency, Converter={StaticResource IntToRYGBBoarderBrushConverter}}">
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding Path=IssSubject}" Margin="3" FontWeight="Bold" FontSize="14"/>

                <!--DataTrigger will collapse following panel for simple view-->
                 <StackPanel Name="IssueDetailPanel" Visibility="Visible" Margin="3">                     
                    <StackPanel Width="Auto" Orientation="Horizontal">
                        <TextBlock Text="Due: " FontWeight="Bold"/>
                        <TextBlock Text="{Binding Path=IssDueDate}" FontStyle="Italic" HorizontalAlignment="Left"/>
                    </StackPanel>
                    <StackPanel Width="Auto" Orientation="Horizontal">
                        <TextBlock Text="Category: " FontWeight="Bold"/>
                        <TextBlock Text="{Binding Path=IssCategory}"/>
                    </StackPanel>
                </StackPanel>

            </StackPanel>
        </Border>

        // This is where I have the issue, ShowDetailListItems is in the base class, not the collection
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=ShowDetailListItems, Mode=TwoWay}" Value="False">
                <Setter TargetName="IssueDetailPanel" Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

I have learned a TON doing this but this current issue is driving me batty, no luck with google, MSDN, SO or a couple books

I thought I would add this note: I am learning this in order to build some apps for my business, I am a rank beginner in wpf and xaml so I relize this is probably somthing silly. I would really like to find a good tutorial on datacontexts as what I do find is a dozen different "How To's" that are all totally different. I know I have some big holes in my knowledge because I keep ending up with multiple instantiations of my viewmodel class when I try to create references to my datacontext in the codebehind, Window1.xaml and app.xaml files.

+2  A: 

Have you tried one of these?

{Binding Path=ShowDetailListItems, ElementName=YourWindowName}

or

{Binding ShowDetailListItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}
Auresco82
I had to make a few changes but this led me to the solution. I am not sure how I missed the RelativeSource class but know I know. For others with this issue, to make this work I had to promote the StatusBoardViewModel in Window1.xaml.cs to a property and change the binding in the DataTrigger to Binding="{Binding Path=StatusBoardViewModel.ShowDetailListItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Mike B