Привязка данных к строке, полученной из счетчика списка - PullRequest
1 голос
/ 03 сентября 2011

У меня есть TextBlock, я хотел бы привязать его к счету List<T>. Вроде, как бы, что-то вроде.

Я могу связать это так:

<TextBlock Name="tbAlerts" Text="{Binding Path=Alerts.Count}" />

где Alerts - List<String>, и он отображает правильную вещь. Но я хотел бы отобразить «Нет предупреждений», когда счетчик равен нулю.

Я думал, что способ сделать это состоит в том, чтобы расширить List для предоставления дополнительного строкового свойства - назовите его CountText - которое испускает желаемую строку. Он может выдавать «No Alerts», когда count равен нулю, и «One alert», когда Count==1. Будет ли это работать?

Если я сделаю это, как я получу изменение в Count для события PropertyChanged для CountText, чтобы оно обновлялось в пользовательском интерфейсе WPF?

это предпочтительный способ получить желаемый эффект?

Ответы [ 2 ]

4 голосов
/ 03 сентября 2011

Помимо решения «Конвертер», вы также можете сделать это непосредственно в Xaml, изменив свойство Text на «Нет элементов», если в списке нет элементов

<TextBlock Name="tbAlerts">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="{Binding Path=Alerts.Count}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Alerts.Count}" Value="0">
                    <Setter Property="Text" Value="No Items"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
2 голосов
/ 03 сентября 2011

Один из способов сделать это - создать IValueConverter , который будет возвращать строку, если значение равно нулю, и / или любое другое число, к которому вы хотите добавить пользовательский текст.Что касается обновления пользовательского интерфейса при изменении количества, вам придется вызывать обработчик PropertyChanged в списке каждый раз, когда элемент добавляется / удаляется из списка предупреждений.

public class AlertCountConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string result = null;
        if (value != null)
        {
            int count = System.Convert.ToInt32(value);
            if (value == 0)
               result = "No Alerts";
            else
               result = count.ToString();
         }
         return result;

     }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         return new NotImplementedException();
     }
}
<UserControl.Resources>
   <local:AlertCountConverter x:Key="AlertCountConverter"/>
</UserControl.Resources>
<TextBlock x:Name="tbAlerts" Text="{Binding Alerts.Count, Converter={StaticResource AlertCountConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...