Como faço para corrigir "a vinculação de Duas vias requer o Caminho XPath ou" exceção no WPF Datagrids?
-
13-11-2019 - |
Pergunta
Fundo/contexto para esta pergunta: Eu tenho um WPF aplicativo da área de trabalho.Ele usa o LINQ to SQL para se conectar ao seu banco de dados SQL, e apresenta os dados em WPF Datagrids.Ele estava funcionando muito bem, mas o desempenho era um problema porque o LINQ pode ser mortal lento, por isso tenho sido comutação minha lógica e controles de INTERFACE do usuário fora do LINQ banco de dados contextos, tanto quanto possível, e em vez de carregá-los em variáveis locais, que são muito semelhantes para o LINQ objetos, que, maciçamente, melhora o desempenho.
O problema: Como eu testar meu Datagrids, estou começando agora uma nova exceção "Vinculação bidirecional exige Caminho ou XPath."quando tento editar o valor de uma certa (inteiro) coluna de um Datagrid, embora a edição seqüência de colunas tinham trabalhado bem.Eu não entendo por que estou recebendo um presente, ou o que fazer sobre isso.
Por isso funcionou quando o datagrid.datacontext foi definida para um LINQ entidade associação, mas só quase funciona quando é definida uma lista de simples objetos.Eu tentei alterar a lista para uma ObservableCollection, mas isso não teve efeito aparente.
Eu olhei em cerca de uma dúzia de diferentes questões relacionadas aqui e em outros sites, e não estou a ver qualquer coisa que parece ajudar.
Atualmente tenho:
<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>
qual é regido pelo código:
dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;
que é definido como:
public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();
cujo vinculado membros são:
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;
Achei uma forma muito simples de corrigir logo depois de escrever isso, o que eu vou postar quando o site me permite, depois de 8 horas de atraso.
Solução 3
Ok, bem, depois de ter introduzido todos que, eu tentei algo que funcionou.Estou postando, caso isso ajuda os outros.
A solução foi adicionar o problema membro variáveis que estão vinculados:
{ get;conjunto;}
Como em:
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; }
Outras dicas
Eu tive esse problema com uma caixa de texto dependente.Minha solução foi ligar explicitamente a ".":
<TextBox Text="{Binding Path=.}" />
Que fez o truque.
Uma "vinculação bidirecional exige Caminho XPath ou" falha pode ser causado por uma diferença pequena no nome do caminho no XAML vs o do c# elemento de Ligação.As capitais carta de são realmente importantes!Esse foi o meu problema.
XAML:
<DataGridTextColumn Binding="{Binding Path=TotalHeure}" ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>
C#:
public string Totalheure { get; set; }
isso fará com que uma vinculação bidirecional, exigindo um Caminho XPath ou erro, porque eles não são exatamente os mesmos e programas não é capaz de encontrar o caminho de ligação!
Talvez possa ajudar alguém que cometeu o Mesmo erro
Pode-se, por vezes, fazer um pouco estranho uma coisa, quando você chegar cansado no final do dia.Eu tenho um Datagrid de ligação para um entity Framework Entidade denominada Dependente - campos Name_of_Dependant / Relacionamento / Date_of_Birth.De alguma forma eu decied para criar novas propriedades :FullNames / Relacionamento / data de nascimento - de todos os tipos.
Então, na minha datagrid eu ligar para um
ObservableCollection<Dependant>
Mas minhas colunas deve, em seguida, ligue as colunas na minha tabela de entidade Dependente.Então, isso é correto:
Binding="{Binding Name_of_Dependant}"
Isso estava errado:
Binding="{Binding FullNames}"