Não há realmente nenhuma maneira de acompanhar dataset relação pais na ligação xaml?

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

Pergunta

Suponha que eu tenho um conjunto de dados com essas duas tabelas imortais: Empregado & Order
Emp -> ID, Nome
Ord -> Algo, Anotherthing, EmpID
E relação Rel : Ord (EmpID) -> Emp (ID)

Ele funciona muito bem no padrão mestre / detalhe cenário
(Mostrar aos funcionários, siga para baixo a relação, mostram ordens relacionadas),
mas o que quando eu luto para seguir o caminho oposto (mostrar mesa Ord com Emp.Name)?

Algo como isto:

<stackpanel>   // with datacontext set from code to dataset.tables["ord"]
   <TextBox Text="{Binding Something}"/>
   <TextBox Text="{Binding Anotherthing}"/>
   <TextBox Text="{Binding ???}"/> // that's my problem, how to show related Emp.Name 
</stackpanel>

Todas as idéias? Eu posso criar conversor de valor, mas se eu quero para usar conjunto de dados exemplo que eu recebo de módulo pai fica complicado.

Foi útil?

Solução

Se você quiser sincronizar o conteúdo de vários controles, você vai precisar tê-los compartilhar a mesma fonte de ligação através do DataContext set em um controle pai comum. Aqui está um exemplo:

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- We set the data context to the collection of rows in the table -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS.Rows}">
        <ListBox ItemsSource="{Binding}"
                 DisplayMemberPath="NAME"
                 IsSynchronizedWithCurrentItem="True" />
        <TextBox Text="{Binding Path=NAME}"/>
        <TextBox Text="{Binding Path=COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>

Definindo a IsSynchronizedWithCurrentItem para 'True' fará com que o ListBox.SelectedItem propriedade a ser sincronizados automaticamente com o CollectionView.CurrentItem do origem da ligação, que é a coleção de linhas definido no DataContext . Isto significa que a linha atualmente selecionada na caixa de listagem se torna a fonte de ligação para os dois controles de caixa de texto.

Outras dicas

Assumindo que você está usando um DataSet fortemente tipado, a fim de vincular a caixa de texto para a propriedade 'EmpRow.Name', você provavelmente terá de expô-la como uma propriedade na classe 'OrdDataTable'.

Uma vez que Visual Studio gera o código digitado DataSet com classes parciais, você pode adicionar a propriedade de classe do 'OrdDataTable' desta forma:

using System.Data;

public partial class OrdDataTable : DataTable
{
    public string EmpName
    {
        get { return this.EmpRow.Name; }
    }
}

Em seguida, você seria capaz de se ligar à propriedade 'EmpName' do objeto 'OrdDataTable' no contexto de dados.

O que é o DataContext para os dois controles TextBox?
Para a segunda ligação para trabalhar o DataContext deve ser definido como uma instância da 'USERSDataTable'. Uma vez que estes estão contidos em uma matriz no DataSet, você tem que dizer explicitamente que tabela que você deseja ligar. Algo como:

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- Notice we set the data context to the first item in the array of tables -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS[0]}">
        <TextBox Text="{Binding NAME}"/>
        <TextBox Text="{Binding COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top