|
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
|
Tradução
Original
|
Visão geral de vinculação de dados
Este tópico contém as seções a seguir.
-
O conteúdo do ListBox é associado a uma coleção de objetos AuctionItem. Um objeto AuctionItem tem propriedades tais como Description, StartPrice, StartDate, Category, SpecialFeatures, etc. -
Os dados (objetos AuctionItem) mostrados no ListBox é padronizado de forma que a descrição e o preço atual são mostrados para cada item. Isto é feito utilizando um DataTemplate. Adicionalmente, a aparência de cada item depende do valor SpecialFeaturesdo AuctionItem sendo exibido. Se o valor SpecialFeatures do AuctionItem é Color, o item tem uma borda azul. Se o valor é Highlight, o item tem uma borda laranja e uma estrela. A seção Padronização de Dados fornece informação sobre padronização de dados. -
O usuário pode agrupar, filtrar ou ordenar os dados utilizando os CheckBoxs fornecidos. Na imagem acima, os CheckBox "Agrupar por categoria" e "Ordenar por categoria e data" são selecionados. Você deve ter percebido que os dados são agrupados baseados na categoria do produto, e no nome da categoria em ordem alfabética. É difícil perceber da imagem, mas os itens também estão ordenados pela data de início dentro de cada categoria. Isto é feito utilizando uma visualização de coleção. A seção Associando Coleções discute visualizações de coleções. -
Quando o usuário seleciona um item, o ContentControl exibe os detalhes do item selecionado. Isto é chamado de Master-Detail scenario. A seção Cenário de Detalhe-Mestre fornece informação sobre os tipos de associação de cenário. -
O tipo da propriedade StartDate é DateTime, que retorna a data que inclui o tempo em milissegundos. Nesta aplicação, um conversor personalizado foi utilizado para que string de data menores fosse exibida. A seção Conversão de Dados fornece informações sobre conversores.
Esta seção contém as subseções a seguir.

Tipicamente, cada associação possui estes quatro componentes: um objeto alvo da associação, uma propriedade alvo, uma fonte da associação, e um caminho para o valor na fonte da associação a ser usado. Por exemplo, se você quer associar o conteúdo de um TextBox à propriedade Nome de objeto Empregado , seu objeto alvo é o TextBox, e a propriedade alvo é a propriedade Text , o valor a ser usado é o Nome, e o objeto fonte é o objeto Employee. A propriedade alvo deve ser uma propriedade de dependência. A maioria das propriedades UIElement são propriedade de dependência e a maioria das propriedade de dependência, exceto as somente leitura, aceitam associação de dados por padrão. (Somente tipos DependencyObject podem definir propriedade de dependência e todos UIElements derivam de DependencyObject.) Embora não especificado na figura, é importante observar que o fonte de ligação o objeto não é restrito para sendo um personalizado CLR objeto. WPFligação de dados oferece suporte a dados na forma de CLR objetos e XML. Para dar alguns exemplos, sua fonte da associação pode ser um UIElement, qualquer lista de objetos, um objeto CLR que é associado a dados com ADO.NET ou Serviços Web, ou um NóXml que contém seus dados XML. Para maiores informações, acesse Visão geral sobre associação de fontes.
Direção do Fluxo de Dados

Associação OneWay faz com que as mudanças na propriedade fonte sejam automaticamente atualizadas na propriedade alvo, porém mudanças na propriedade alvo não são propagadas de volta para a propriedade fonte. Este tipo de associação é adequado se o controle sendo associado é implicitamente somente leitura. Por exemplo, você pode associar uma fonte como um mostrador de cotação de ações ou talvez sua propriedade alvo não tenha nenhuma interface de controle disponível para realizar mudanças, tais como uma cor de fundo de uma tabela. Não há necessidade de monitorar as mudanças da propriedade alvo, usando o modo de associação OneWay evita o overhead do modo de associação TwoWay. A associação TwoWay faz com que mudanças em tanto a propriedade fonte quanto a propriedade alvo sejam automaticamente atualizadas na outra. Este tipo de associação é apropriado para formulários editáveis ou outros cenários UI totalmente interativos. O padrão da maioria das propriedades é associação OneWay, mas algumas propriedades de dependência (tipicamente propriedades de controles editáveis pelo usuário tais como a propriedade Text do TextBox e a propriedade IsCheckeddo CheckBox) tem como padrão a associação TwoWay. Uma maneira de determinar programaticamente se uma propriedade de dependência é associada em direção única ou bidirecionalmente por padrão é definir o meta-dado da propriedade usando GetMetadata e especificando o valor booleano da propriedade BindsTwoWayByDefault. OneWayToSource é o inverso da associação OneWay; só atualiza a propriedade fonte quando a propriedade alvo é modificada. Um cenário exemplo é se você só precisa reavaliar o valor da fonte de um UI. Não é ilustrado na figura a associação OneTime, que faz com que a propriedade fonte inicialize a propriedade alvo, mas mudanças subsequentes não são propagadas. Isso significa que se o contexto de dados passa por uma alteração ou o objeto em que as alterações de contexto de dados, em seguida, a alteração não será refletida na propriedade de destino. Este tipo de associação é apropriado se você está usando dados onde tanto um estado atual momentâneo é apropriado para o usuário ou os dados são realmente estáticos. Este tipo de associação também é útil se você quer inicializar sua propriedade alvo com alguns valores da propriedade fonte e o contexto de dados não é conhecido de antemão. Isto é essencialmente uma forma mais simples da associação OneWay que fornece uma performance melhor em casos onde o valor da fonte não é modificado.
O Que Causa Atualização de Fonte

Esta seção contém as subseções a seguir.
- Especificando a Fonte da Associação
- Especificando o Caminho ao Valor
- Associação e Expressão de Associação
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:SDKSample"> <DockPanel.Resources> <c:MyData x:Key="myDataSource"/> </DockPanel.Resources> <DockPanel.DataContext> <Binding Source="{StaticResource myDataSource}"/> </DockPanel.DataContext> <Button Background="{Binding Path=ColorName}" Width="150" Height="30">I am bound to be RED!</Button> </DockPanel>

Especificando a Fonte da Associação
<DockPanel.Resources> <c:MyData x:Key="myDataSource"/> </DockPanel.Resources> <Button Width="150" Height="30" Background="{Binding Source={StaticResource myDataSource}, Path=ColorName}">I am bound to be RED!</Button>
Especificando o Caminho ao Valor
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="true"/>
Associação e Expressão de Associação
[ValueConversion(typeof(Color), typeof(SolidColorBrush))] public class ColorBrushConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Color color = (Color)value; return new SolidColorBrush(color); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return null; } }
-
Seus dados devem ser exibidos de maneira diferente, dependendo da cultura. Por exemplo, você talvez queira implementar um conversor de moeda ou um conversor de calendário data/hora baseado nos valores ou padrões utilizados em uma cultura em particular. -
Os dados sendo usados não necessariamente precisam modificar o valor texto da propriedade, mas para modificar alguns outros valores, como a fonte de uma imagem, ou a cor e estilo de exibição de texto. Conversores podem ser usados nesta instância convertendo a associação de uma propriedade que pode não parecer apropriada, como a associar um campo texto a uma propriedade Background de uma célula de tabela. -
Mais de um controle ou múltiplas propriedades de controle são associadas a um mesmo dado. Neste caso, a associação primária pode simplesmente exibir o texto, onde outras associações lidam com questões específicas de exibição, mas ainda usam a mesma associação como fonte de informação. -
Até agora não discutimos MultiBinding, onde a propriedade alvo tem uma coleção de associações. No caso de um MultiBinding, você usa um IMultiValueConverter personalizado para produzir um valor final dos valores da associação. Por exemplo, cor pode ser computado dos valores vermelho, azul e verde, que podem ser valores de um ou diferentes objetos fonte de associação. Consulte a página da classe MultiBinding para exemplos e informação.
Esta seção contém as subseções a seguir.

Como Implementar Coleções
Visualizações de Coleções
Esta seção contém as subseções a seguir.
- O Que são Visualização de Coleções?
- Como Criar uma Visualização
- Classificação
- Filtro
- Agrupamento
- Ponteiros do Item atual
- Cenário de Associação Master-Detail
O Que são Visualização de Coleções?
Como Criar uma Visualização
<Window.Resources> ... <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}" x:Key="listingDataView" /> ... </Window.Resources>
<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8" ItemsSource="{Binding Source={StaticResource listingDataView}}"> ... </ListBox>
|
Usando um modo de exibição padrão
Exibições de coleção com o ADO.NET DataTables
Classificação
private void AddSorting(object sender, RoutedEventArgs args) { // This sorts the items first by Category and within each Category, // by StartDate. Notice that because Category is an enumeration, // the order of the items is the same as in the enumeration declaration listingDataView.SortDescriptions.Add( new SortDescription("Category", ListSortDirection.Ascending)); listingDataView.SortDescriptions.Add( new SortDescription("StartDate", ListSortDirection.Ascending)); }
Filtro
Agrupamento
Ponteiros do Item atual
<Button Content="{Binding }" /> <Button Content="{Binding Path=/}" /> <Button Content="{Binding Path=/Description}" />
<Button Content="{Binding /Offices/}" />
Cenário de Associação Master-Detail
<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8" ItemsSource="{Binding Source={StaticResource listingDataView}}"> ... </ListBox> ... <ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3" Content="{Binding Source={StaticResource listingDataView}}" ContentTemplate="{StaticResource detailsProductListingTemplate}" Margin="9,0,0,0"/>
<DataTemplate DataType="{x:Type src:AuctionItem}"> <Border BorderThickness="1" BorderBrush="Gray" Padding="7" Name="border" Margin="3" Width="500"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="86"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Polygon Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Fill="Yellow" Stroke="Black" StrokeThickness="1" StrokeLineJoin="Round" Width="20" Height="20" Stretch="Fill" Points="9,2 11,7 17,7 12,10 14,15 9,12 4,15 6,10 1,7 7,7" Visibility="Hidden" Name="star"/> <TextBlock Grid.Row="0" Grid.Column="1" Margin="0,0,8,0" Name="descriptionTitle" Style="{StaticResource smallTitleStyle}">Description:</TextBlock> <TextBlock Name="DescriptionDTDataType" Grid.Row="0" Grid.Column="2" Text="{Binding Path=Description}" Style="{StaticResource textStyleTextBlock}"/> <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,0,8,0" Name="currentPriceTitle" Style="{StaticResource smallTitleStyle}">Current Price:</TextBlock> <StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal"> <TextBlock Text="$" Style="{StaticResource textStyleTextBlock}"/> <TextBlock Name="CurrentPriceDTDataType" Text="{Binding Path=CurrentPrice}" Style="{StaticResource textStyleTextBlock}"/> </StackPanel> </Grid> </Border> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=SpecialFeatures}"> <DataTrigger.Value> <src:SpecialFeatures>Color</src:SpecialFeatures> </DataTrigger.Value> <DataTrigger.Setters> <Setter Property="BorderBrush" Value="DodgerBlue" TargetName="border" /> <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" /> <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" /> <Setter Property="BorderThickness" Value="3" TargetName="border" /> <Setter Property="Padding" Value="5" TargetName="border" /> </DataTrigger.Setters> </DataTrigger> <DataTrigger Binding="{Binding Path=SpecialFeatures}"> <DataTrigger.Value> <src:SpecialFeatures>Highlight</src:SpecialFeatures> </DataTrigger.Value> <Setter Property="BorderBrush" Value="Orange" TargetName="border" /> <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" /> <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" /> <Setter Property="Visibility" Value="Visible" TargetName="star" /> <Setter Property="BorderThickness" Value="3" TargetName="border" /> <Setter Property="Padding" Value="5" TargetName="border" /> </DataTrigger> </DataTemplate.Triggers> </DataTemplate>
Esta seção contém as subseções a seguir.
Associando Regras de Validação com uma Associação.
<TextBox Name="StartPriceEntryForm" Grid.Row="2" Grid.Column="1" Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5"> <TextBox.Text> <Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <ExceptionValidationRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
A ExceptionValidationRule verifica se há exceções geradas durante a atualização da propriedade de origem de ligação. No exemplo anterior, StartPrice é do tipo número inteiro. Quando o usuário imputa um valor que não pode ser convertido para inteiro, uma exceção é gerada, fazendo a associação ser marcada como inválida. Uma sintaxe alternativa a configuração do ExceptionValidationRule explicitamente é definir o ValidatesOnExceptions propriedade para true em seu Binding ou MultiBinding objeto. A DataErrorValidationRule objeto verifica erros que são gerados por objetos que implementam o IDataErrorInfo interface. Para obter um exemplo de usar esta regra de validação, consulte DataErrorValidationRule. Uma sintaxe alternativa a configuração do DataErrorValidationRule explicitamente é definir o ValidatesOnDataErrors propriedade para true em seu Binding ou MultiBinding objeto.
class FutureDateRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { DateTime date; try { date = DateTime.Parse(value.ToString()); } catch (FormatException) { return new ValidationResult(false, "Value is not a valid date."); } if (DateTime.Now.Date > date) { return new ValidationResult(false, "Please enter a date in the future."); } else { return ValidationResult.ValidResult; } } }
<TextBox Name="StartDateEntryForm" Grid.Row="3" Grid.Column="1" Validation.ErrorTemplate="{StaticResource validationTemplate}" Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5"> <TextBox.Text> <Binding Path="StartDate" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource dateConverter}" > <Binding.ValidationRules> <src:FutureDateRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
Fornecendo Feedback Visual
<ControlTemplate x:Key="validationTemplate"> <DockPanel> <TextBlock Foreground="Red" FontSize="20">!</TextBlock> <AdornedElementPlaceholder/> </DockPanel> </ControlTemplate>
<Style x:Key="textStyleTextBox" TargetType="TextBox"> <Setter Property="Foreground" Value="#333333" /> <Setter Property="MaxLength" Value="40" /> <Setter Property="Width" Value="392" /> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style>


Processo de Validação
O mecanismo de ligação verifica se há qualquer personalizado ValidationRule objetos definidos cuja ValidationStep for definido como RawProposedValue para que Binding, caso em que ele chama o Validate método em cada ValidationRule até que um deles é executado em um erro ou passam por todas elas. O mecanismo de ligação, em seguida, chama o conversor, se houver. Se o conversor for bem-sucedida, o mecanismo de ligação verifica se há qualquer personalizado ValidationRule objetos definidos cuja ValidationStep for definido como ConvertedProposedValue para que Binding, caso em que ele chama o Validate método em cada ValidationRule que tem ValidationStep definido como ConvertedProposedValue até que um deles é executado em um erro ou passam por todas elas. O mecanismo de ligação define a propriedade source. O mecanismo de ligação verifica se há qualquer personalizado ValidationRule objetos definidos cuja ValidationStep for definido como UpdatedValue para que Binding, caso em que ele chama o Validate método em cada ValidationRule que tem ValidationStep definido como UpdatedValue até que um deles é executado em um erro ou passam por todas elas. Se um DataErrorValidationRule está associada uma ligação e seu ValidationStep é definida como padrão, UpdatedValue, o DataErrorValidationRule é verificado neste momento. Também é o ponto quando as vinculações que têm o ValidatesOnDataErrors definido como true são verificados. O mecanismo de ligação verifica se há qualquer personalizado ValidationRule objetos definidos cuja ValidationStep for definido como CommittedValue para que Binding, caso em que ele chama o Validate método em cada ValidationRule que tem ValidationStep definido como CommittedValue até que um deles é executado em um erro ou passam por todas elas.