Como faço para corrigir "a vinculação de Duas vias requer o Caminho XPath ou" exceção no WPF Datagrids?

StackOverflow https://stackoverflow.com/questions/9449689

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.

Foi útil?

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}"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top