Привязка к сумме SelectedItems в WPF GridView - PullRequest
2 голосов
/ 30 июля 2009

У меня есть GridView, который содержит список файлов, даты создания и размеры файлов. Под сеткой у меня есть текстовое поле с надписью «Выбрано X файлов. Y МБ». Я могу просто привязать к SelectedItems.Count, но могу ли я легко привязать к сумме размеров файлов для выбранных?

Следующие знаки вопроса должны быть суммой значений столбца SelectedItems fileSize. Есть идеи?

<TextBlock HorizontalAlignment="Right">
        <TextBlock.Text>
            <MultiBinding StringFormat=" {0} Files Selected. {1} MB">
                <Binding ElementName="FilesList" Path="SelectedItems.Count"></Binding>
                <Binding ElementName="FilesList" Path="SelectedItems.?????"></Binding>
            </MultiBinding>
        </TextBlock.Text>
</TextBlock>

Я знаю, что могу сделать это в коде позади, но я бы хотел оставить свой код пустым и сделать это в XAML Это код за кодом:

private void FilesList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    double x = 0;

    foreach (FileInfo fileInfo in FilesList.SelectedItems)
    {
        x += fileInfo.Length;
    }
}

Ответы [ 3 ]

6 голосов
/ 30 июля 2009

Для этого вам понадобится конвертер. Пример: Xaml:




<MultiBinding StringFormat=" {0} Files Selected. {1} MB">
                        <Binding ElementName="FilesList" Path="SelectedItems.Count"></Binding>
                        <Binding ElementName="FilesList" Path="SelectedItems" Converter="{StaticResource sumconverter}"></Binding>
                </MultiBinding>

Codebehind:


[ValueConversion(typeof(ListViewItem[]), typeof(string))]
    class SumConverter : IValueConverter {
        public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
            int size = 0;
            ListViewItem[] items = (ListViewItem[])value;
            if(items != null){
                foreach(var lvi in items){
                    Someclass sc = lvi.content as Someclass;
                    if(sc!=null){
                        size += sc.Size;
                    }
                }
            }
            return (size / 1000) + "MB";
        }

        public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
            return null;
        }
    }

0 голосов
/ 30 июля 2009

У вас есть 3 варианта.

  1. Вы можете создать свойство sum в любой сущности, к которой вы привязываетесь (вашей сущности FilesList). Это потребует от вас изменить вашу коллекцию FilesList на CollectionView, чтобы вы могли получить доступ к свойству SelectedItems из вашей ViewModel (если вы еще этого не делаете).

  2. Я никогда не пробовал этого, но вы могли бы использовать «Преобразователь значений выражений» Кента Бугаарта, который позволяет вам записывать небольшие кусочки кода на C # в ваших выражениях привязки: http://wpfconverters.codeplex.com/

  3. Предоставляет простой ValueConverter, который преобразует коллекцию того, чем является ваша сущность, в десятичное число или что-то еще (это, вероятно, самая простая вещь).

0 голосов
/ 30 июля 2009

К сожалению, вы не сможете сделать это в XAML, в одиночку.

Вам нужно будет привязать сами SelectedItems и предоставить конвертер значений. Преобразователь значений должен выполнять итерацию по каждому пути к файлу, создавать объект FileInfo из пути и суммировать размеры, используя свойство FileInfo.Length .

...