Pregunta

Fondo / contexto para esta pregunta: Tengo una aplicación de escritorio WPF. Utiliza Linq a SQL para conectarse a su base de datos SQL, y muestra sus datos en WPF DataGrids. Estaba funcionando bastante bien, pero el desempeño fue un problema porque Linq puede ser mortal lento, por lo que he estado cambiando mis controles lógica y UI lejos de los contextos de la base de datos LINQ tanto como sea posible, y en su lugar cariño en las variables locales que son muy similares a Los objetos LINQ, que mejoran masivamente el rendimiento.

El problema: Mientras pruebo mis DataGrids, ahora estoy recibiendo una nueva excepción " La fijación de dos vías requiere ruta o xpath. " Cuando intento editar el valor en un determinado (entero ) La columna de un DataGrid, aunque editar columnas de cadena habían estado funcionando bien. No entiendo por qué estoy recibiendo esto, o qué hacer al respecto.

Entonces funcionó cuando el DataGrid.Datacontext se estableció en una asociación de entidades LINQ, pero solo casi funciona cuando se establece en una lista de objetos lisos. Intenté cambiar la lista a una selección de observabilidad, pero esto no tenía ningún efecto aparente.

He mirado a una docena de preguntas relacionadas diferentes aquí y en otros sitios, y no estoy viendo nada que parece ayudar.

Actualmente tengo:

<DataGrid Margin="12,110,12,0" x:Name="dgDays" ItemsSource="{Binding}" 
                 Height="165" VerticalAlignment="Top" MinHeight="0" 
                 AutoGenerateColumns="False"
                 SelectionChanged="dgDays_SelectionChanged">

...

<DataGrid.Columns>
            <DataGridComboBoxColumn Width="80" Header="Cook" x:Name="_DailyCookCombo" SelectedItemBinding="{Binding sCook}"/>
            <DataGridComboBoxColumn Width="80" Header="Eat" x:Name="_DailyDayCombo" SelectedItemBinding="{Binding sDay}"/>
            <DataGridTextColumn Width="52" Header="Prot" Binding="{Binding Protein}" />
            <DataGridTextColumn Width="52" Header="Carb" Binding="{Binding Carb}" />
            <DataGridTextColumn Width="52" Header="Fat" Binding="{Binding Fat}" />
            <DataGridTextColumn Width="62" Header="Prot %" Binding="{Binding ProteinPercent}" />
            <DataGridTextColumn Width="62" Header="Carb %" Binding="{Binding CarbPercent}" />
            <DataGridTextColumn Width="62" Header="Fat %" Binding="{Binding FatPercent}" />
            <DataGridTextColumn Width="116" Header="non PFW meals" Binding="{Binding NonPFWMeals}" />
            <DataGridTextColumn Width="55" Header="Prot" Binding="{Binding CalcProt}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Carb" Binding="{Binding CalcCarbs}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Fat" Binding="{Binding CalcFat}" IsReadOnly="True" />
            <DataGridTextColumn Width="65" Header="KCal" Binding="{Binding CalcKCal}" IsReadOnly="True" />
            <DataGridCheckBoxColumn Width="32" Header="Skip" Binding="{Binding Skip}"  />
            <DataGridTextColumn Width="70" Header="Date" Binding="{Binding sNextDate}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

que está obligado por el código:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;

que se define como:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();

cuyos miembros encuadernados son:

    public class RAM_Member_Requirements_Day : INotifyPropertyChanged
{
    // RAM equivalents of DB values:
public System.Nullable<decimal> Protein;
public System.Nullable<decimal> Carb;
public System.Nullable<decimal> Fat;
public System.Nullable<decimal> ProteinPercent;
public System.Nullable<decimal> CarbPercent;
public System.Nullable<decimal> FatPercent;
public System.Nullable<int> NonPFWMeals;
public System.Nullable<bool> Skip;
public System.Nullable<System.DateTime> SkipDate;

Encontré una solución muy simple poco después de escribir esto, lo que publicaré cuando el sitio me permita un retraso de 8 horas.

¿Fue útil?

Solución 3

OK, bueno, habiendo escrito todo eso, intenté algo que funcionó.Estoy publicando de todos modos, en caso de que ayude a otros.

La solución fue agregar a las variables de los miembros del problema que están unidos:

{get;colocar;}

como en:

    public System.Nullable<decimal> Protein { get; set; }
    public System.Nullable<decimal> Carb { get; set; }
    public System.Nullable<decimal> Fat { get; set; }
    public System.Nullable<decimal> ProteinPercent { get; set; }
    public System.Nullable<decimal> CarbPercent { get; set; }
    public System.Nullable<decimal> FatPercent { get; set; }
    public System.Nullable<int> NonPFWMeals { get; set; }
    public System.Nullable<bool> Skip { get; set; }

Otros consejos

Me encontré con este problema con un cuadro de texto unido.Mi solución era unirse explícitamente a "".:

<TextBox Text="{Binding Path=.}" />

que hizo el truco.

Una falla "de unión de dos vías requiere una trayectoria o xpath" puede ser causa por una pequeña diferencia en el nombre de la ruta en el XAML vs el en el elemento de enlace C #.¡La carta de capitales es realmente importante!Ese fue mi problema.

xaml:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}"   ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>

c #:

public string Totalheure { get; set; }

Esto causará una vinculación de dos vías que requiera un error de ruta o xpath porque no son exactamente iguales y los programas no pueden encontrar la ruta de enlace!

Tal vez lo ayudará a alguien más que cometió el mismo error

A veces puede hacer una pequeña cosa extraña cuando se canse al final del día. Tengo una unión de DataGrid a una entidad marco de entidad llamada dependiente - campos name_of_dependant / relación / date_of_birth. De alguna manera, me decidí crear nuevas propiedades: nombres de huéspedes / relaciones / datefbirth - todos los tipos correctos.
Así que en mi DataGrid me atas a un

ObservableCollection<Dependant> 

Pero mis columnas deben atarse a las columnas en la tabla de mi entidad dependientes. Así que esto es correcto:

Binding="{Binding Name_of_Dependant}"

Esto fue incorrecto:

Binding="{Binding FullNames}"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top