1

私のwpfアプリでは、次のようなデータグリッドがあります

                            <Custom:DataGrid x:Name="dg_nba" IsEnabled="{Binding Iseditmode}" SelectionMode="Single" ItemsSource="{Binding Products}" Style="{DynamicResource myDataGridStyle}" IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" ColumnWidth="*">
                        <Custom:DataGrid.Columns>
                            <Custom:DataGridTextColumn x:Name="dgt_nba_id" Header="Id" Binding="{Binding ID}" MaxWidth="40"/>
                            <Custom:DataGridTextColumn x:Name="dgt_nba_name" Binding="{Binding Name}" Header="Name"/>
                            <Custom:DataGridTemplateColumn x:Name="dgtc_nba_incl" Header="Include" MaxWidth="50">
                                <Custom:DataGridTemplateColumn.CellTemplate >
                                    <DataTemplate>
                                            <CheckBox HorizontalAlignment="Center" Style="{DynamicResource myCheckBoxStyle}"/>
                                    </DataTemplate>
                                </Custom:DataGridTemplateColumn.CellTemplate>
                            </Custom:DataGridTemplateColumn>
                        </Custom:DataGrid.Columns>
                    </Custom:DataGrid>

datagrid id 、 name 列を製品のデフォルト コレクションにバインドしました。製品のみが含まれる製品リストの別のコレクションがあります。リストに製品が含まれている場合は、チェックボックスをオンにする必要があります。

コレクションからブール値へのコンバーターを手伝ってくれる人はいますか。私は最善を尽くしましたが、それを正しくすることができませんでした。

前もって感謝します。

4

2 に答える 2

1

値コンバーターを使用する場合は、試してみることをお勧めしますIMultiValueConverter。他のコレクションを値として渡し、探しているIDをコンバーターに渡される 2 つの異なる値として渡すことができます。それを機能させるには、次のことを行う必要があります。

  • XAML でコード ビハインド変数にアクセスできるようにします。ここでそれを行うためのいくつかの方法に関する詳細情報を見つけることができます: Access codebehind variable in XAML
  • 実装しIMultiValueConverterます。アプリケーションの詳細 (使用しているコレクションのタイプなど) によって異なりますが、多かれ少なかれ次のように見える場合があります。

    class ICollectionToBoolConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            try
            {
                //verify if appropriate number of values is bound
                if (values != null && values.Length == 2)
                {
                    List<Product> productsList = (values[0] as List<Product>);
    
                    //if converter is used with appropriate collection type
                    if (productsList != null)
                    {
                        //if there is object ID specified to be found in the collection
                        if (values[1] != null)
                        {
                            int objectToFindId = (int)values[1];
    
                            //return information if the collection contains an item with ID specified in parameter
                            return productsList.Any(p => p.ID == objectToFindId);
                        }
                    }
                }
    
                //return false if object is not found or converter is used inappropriately
                return false;
            }
            catch
            {
                return false;
            }
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
  • 新しく作成したコンバーターをResourcesof Window(またはUserControl) に配置しDataGridます。

    <c:ICollectionToBoolConverter x:Key="collectionToBoolConverter" />
    
  • コンバーターを使用してバインドしCheckBoxます。これは、他のコレクションを公開するために使用する特定の方法に依存する場合があります (この回答の最初のステップで説明したように)。ただし、次のようになります。

    ...
    <Custom:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox HorizontalAlignment="Center" Style="{DynamicResource myCheckBoxStyle}">
                <CheckBox.IsChecked>
                    <MultiBinding Converter="{StaticResource collectionToBoolConverter}">
                        <Binding  ElementName="layoutRoot" Path="Parent.MyCollectionName" />
                        <Binding Path="ID" />
                    </MultiBinding>
                </CheckBox.IsChecked>
            </CheckBox>
        </DataTemplate>
    </Custom:DataGridTemplateColumn.CellTemplate>
    ...
    

私はこれをテストしていないので、これらのタスクのいずれかに問題がある場合はお知らせください。

于 2012-06-27T17:01:24.797 に答える
0

この場合、バインド先のオブジェクトであるViewModelでIsChecked値を計算する方がよい場合があります。VMから記述プロパティ(読み取り専用:HasDesiredProduct)を公開する場合、アイテムがコレクションに追加/削除されるときにそのプロパティを調整し、チェックボックスに読み取り専用の方法で内部ロジックを反映させることができます。

于 2012-06-27T17:12:02.600 に答える