Как поместить логику в мой DataTemplate, например обрабатывать пустую адресную строку? - PullRequest
0 голосов
/ 04 февраля 2009

Я начинаю понимать привязку данных XAML и использую DataTemplate, и это довольно приятно.

Каков наилучший способ сделать следующий шаг и вставить логику в приведенный ниже код, например посмотрите, есть ли что-то в «Address2» и, если да, отобразите это, или по-разному форматировать внешние адреса и т. д.? 1003 *

<Window.Resources>
    <DataTemplate x:Key="CustomersTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="35"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Rectangle Height="30" Width="30" Margin="0 4 0 0" Fill="LightGreen" Grid.Column="0" VerticalAlignment="Top"/>
            <StackPanel Margin="3 0 0 10" Orientation="Vertical" Grid.Column="1">
                <TextBlock Text="{Binding Path=ContactName}"/>
                <TextBlock Text="{Binding Path=CompanyName}"/>
                <TextBlock Text="{Binding Path=Address}"/>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0}, {1} {2}">
                            <Binding Path="City"/>
                            <Binding Path="Region"/>
                            <Binding Path="PostalCode"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </StackPanel>
        </Grid>
    </DataTemplate>
</Window.Resources>

<Grid>
    <ListBox Name="dataListBox" ItemTemplate="{StaticResource CustomersTemplate}"/>
</Grid>

Вот код для полноты (автоматически сгенерированные классы LINQ to SQL на Northwind):

CustomerDataContext dc = new CustomerDataContext();
var query = from companyName in dc.Customers
            select companyName;
dataListBox.ItemsSource = query.ToList();

Ответы [ 2 ]

1 голос
/ 04 февраля 2009

Вы ищете конвертеры WPF. Ознакомьтесь с этими примерами конвертера , чтобы получить представление о том, что вы можете сделать. По сути, вы можете запустить любую пользовательскую логику на объекте до того, как будет установлено значение свойства с помощью привязки. См .: Свойство Binding Converter .

Вы также можете взглянуть на некоторые работы из Codeplex полезных конвертеров.

0 голосов
/ 04 февраля 2009

Добро пожаловать в удивительный мир триггеров, вот код для удаления пустых адресных строк из вашего примера:

Я добавил имя в текстовый блок адреса и добавил DataTrigger, чтобы скрыть его, когда адрес пустой

<Window.Resources>
    <DataTemplate x:Key="CustomersTemplate">
        <Grid>
 ... snip ...
                <TextBlock Name="AddressLine" Text="{Binding Path=Address}"/>
 ... snip ...
        </Grid>
        <DataTemplate.Triggers>
           <DataTrigger Binding="{Binding Path=Address}" Value="">
              <Setter TargetName="AddressLine" Property="Visibility" Value="Collapsed"/>
           </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</Window.Resources>
...