开发者

RelativeSource FindAncestor without static resource in MVVM?

开发者 https://www.devze.com 2023-01-08 07:18 出处:网络
I\'m new to WPF and the MVVM pattern so I have some problems with my bindings. In a details view of a customer, I want to list some statuses in a combobox.

I'm new to WPF and the MVVM pattern so I have some problems with my bindings.

In a details view of a customer, I want to list some statuses in a combobox.

In my ViewModel the customer is at the root level, and so is the list of statuses.

When using a static resource, I can use:

ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}, Path=DataContext.PartGruppAll}"

on my ComboBox, but when I set the DataContext from code behind, it does not work, what am I doing wrong, in my opinion it should make no difference.

Best re开发者_如何学运维gards, Peter Larsson


In your binding, try setting AncestorType to your view class. Something like

ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vw:MyView}}, Path=DataContext.PartGruppAll}"

where vw is your namespace where you keep you view and MyView is the name of your view class itself.

In my application I have declared vw like this

xmlns:vw="clr-namespace:MyApp.View"

(You probably didn't need that bit but I included just in case =)


Its not because you might have a spelling mistake

Path=DataContext.PartGruppAll

might should be

Path=DataContext.PartGroupAll


Oh one more thing...

If the StackPanel is up the same visual tree as the combo box then you dont need to find it in the binding

ItemsSource="{Binding PartGruppAll}" 

Should work as DataCoxtext's are searched up the visual tree.


I'll try to give you some more details, the viewmodel is quite large so I'll try to shorten it.

I instantiate the viewmodel in my code behind for App.xaml

        protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        PartWindow pw = new PartWindow();


        var PartViewModel = new ViewModel.PartWindowViewModel();
        pw.DataContext = PartViewModel;

        pw.Show();
    }

Then in my page I bind the data to a stackpanel:

<StackPanel DataContext="{Binding Path=PartViewModel}">

I then display the Customer in a grid by binding to the Customer-property SelectedPart.

   <Grid DataContext="{Binding SelectedPart}" Margin="5" Grid.Column="0">

My viewModel Looks like this:

ViewModelClass

  • SelectedPart

Name and other properties

  • StatusList

Name and other properties

Nothing really complicated I think... The grid is tied to the selected customer, that's the problem.

0

精彩评论

暂无评论...
验证码 换一张
取 消