Estoy intentando configurar DataContext para mi elemento de plantilla de datos BuildStepsViewModel. El siguiente código funciona perfectamente bien.

<StackPanel Margin="10" Name="controlDisplay" Visibility="{Binding Path=Visibility}">
    <ItemsControl HorizontalAlignment="Left" ItemsSource="{Binding Path=Elements}" Width="Auto">
        <ItemsControl.Resources>
            <DataTemplate DataType="{x:Type vms:BuildStepsViewModel}">
                <local:BuildStepsSelWindow>
                    <local:BuildStepsSelWindow.DataContext>
                        <vms:BuildStepsViewModel/>
                    </local:BuildStepsSelWindow.DataContext>
                </local:BuildStepsSelWindow>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>
 </StackPanel>

Ahora estoy tratando de reducir la parte detallada en el conjunto de contexto de datos.

  <StackPanel Margin="10" Name="controlDisplay" Visibility="{Binding Path=Visibility}">
    <ItemsControl HorizontalAlignment="Left" ItemsSource="{Binding Path=Elements}" Width="Auto">
        <ItemsControl.Resources>
            <DataTemplate DataType="{x:Type vms:BuildStepsViewModel}">
                <local:BuildStepsSelWindow DataContext="{Binding Path=BuildStepsViewModel}"/>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>
 </StackPanel>

Pero ahora los controles en BuildStepsViewModel no se muestran correctamente. ¿Estoy pasando por alto algo?

0
FaisalM 17 dic. 2019 a las 17:15

2 respuestas

La mejor respuesta

En el primer caso, DataContext de es una nueva instancia de vms: BuildStepsViewModel. Esto no parece correcto, ya que desea vincular el DataTemplate a una instancia existente y no a una nueva. En el segundo caso, DataContext está vinculado a alguna propiedad BuildStepsViewModel. La fuente es el antiguo valor DataContext. A menos que el tipo BuildStepsViewModel tenga una propiedad llamada BuildStepsViewModel, este enlace no funcionará correctamente. Si entiendo el caso correctamente, puede intentar omitir el contexto de datos, ya que se heredará y se convertirá automáticamente en la instancia correcta BuildStepsViewModel:

 <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type vms:BuildStepsViewModel}">
            <local:BuildStepsSelWindow />
        </DataTemplate>
    </ItemsControl.Resources>
1
zaphod-ii 17 dic. 2019 a las 14:41

Estas dos fragmentos no son equivalentes.

Éste

<local:BuildStepsSelWindow.DataContext>
    <vms:BuildStepsViewModel/>
</local:BuildStepsSelWindow.DataContext>

Esencialmente significa

this.DataContext = new BuildStepsViewModel();

Por lo tanto, crea una instancia de un nuevo modelo de vista para cada instancia de vista.

Pero esto:

<local:BuildStepsSelWindow DataContext="{Binding Path=BuildStepsViewModel}"/>

Esencialmente significa:

this.DataContext = this.DataContext.BuildStepsViewModel;

¿Ver? Eso no tiene sentido. Está intentando acceder a una propiedad llamada BuildStepsViewModel en el objeto almacenado como DataContext. Pero como no hay contexto de datos (todavía), el enlace devuelve nulo y el contexto de datos no está establecido.

Considere leer detenidamente sobre el enlace de datos . Además, lea sobre la sintaxis XAML.

1
dymanoid 17 dic. 2019 a las 14:26