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作为两个不同的值传递给转换器。为了使其工作,您应该:

  • 使您可以在 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();
        }
    }
    
  • 将您新创建的转换器放入ResourcesWindowUserControl)所在的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 回答