2

ファイル、作成日、およびファイル サイズのリストを含む GridView があります。グリッドの下に、「X ファイルが選択されました。Y MB」というテキストブロックがあります。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;
    }
}
4

3 に答える 3

6

これにはコンバーターを使用する必要があります。例: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>

コードビハインド:


[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;
        }
    }

于 2009-07-30T18:01:38.300 に答える
0

残念ながら、XAMLだけではこれを行うことはできません。

SelectedItems自体にバインドし、値コンバーターを提供する必要があります。値コンバーターは、各ファイルパスを反復処理し、パスからFileInfoオブジェクトを作成し、FileInfo.Lengthプロパティを使用してサイズを合計する必要があります。

于 2009-07-30T18:01:59.110 に答える
0

3つのオプションがあります。

  1. バインドしているエンティティ(FilesListエンティティ)にsumプロパティを作成できます。これには、FilesListコレクションをCollectionViewに変更して、ViewModelからSelectedItemsプロパティにアクセスできるようにする必要があります(まだ行っていない場合)。

  2. 私はこれを試したことがありませんが、バインディング式にC#のようなコードを少し書くことができるKent Boogaartの「ExpressionValueConverter」を使用できる可能性があります:http ://wpfconverters.codeplex.com/

  3. エンティティのコレクションを小数などに変換する単純なValueConverterを提供します(これはおそらく最も簡単な方法です)。

于 2009-07-30T18:02:43.397 に答える