检查DataGrid中位于另一个列表中的行

时间:2014-06-02 23:56:35

标签: c# wpf datagrid

我的DataGrid ObservableCollection类型为Tennant(请原写拼写,我最终会将其修复)为ItemsSourceTennant课程由姓名,电子邮件,电话号码和职业组成。然而,在DataGrid中,我有一组所有Tennants在程序中只有他们的名字,一个复选框,以显示他们是否生活或曾经生活在正在编辑的当前Property,还有一个单选按钮这表明它是Tennant的当前Property。这是一个屏幕截图:

Editing Property Window

我的问题出在Lived Here专栏。这不属于TennantProperty类的任何部分。它改为有两个事件(Checked和Unchecked),它们基本上将它添加到Current Property。这是其中之一。另一个几乎完全相同,除了它是删除而不是添加。 (另外我制作了自己的DataGridColumnTemplate因为CheckBox没有这些事件......)

private void livedHereCheck_Checked(object sender, RoutedEventArgs e)
{
    CheckBox chkd = (sender as CheckBox);
    Tennant cur = (chkd.DataContext as Tennant);
    CurrentProperty.addTennant(cur);
}

这样有效(尽管绝对有更好的方法,我很确定)。当我第一次打开窗口时出现了真正的问题,我需要设置一些已经存在的CheckBoxes,因为它们已经在CurrentProperty.tennants属性中了(原因是它是小写的。还是挂起了wpf和c#标准等。)

目前我有这个:

private void Window_Initialized(object sender, EventArgs e)
{
    var iSource = tennantsGrid.ItemsSource;
    foreach (Tennant cur in iSource)
    {
        var row = tennantsGrid.ItemContainerGenerator.ContainerFromItem(cur);
        if (row != null)
        {
            if (CurrentProperty.hasTennant(cur))
            {
                // Something here... Not sure yet how to actually check the box but that goes here.
            }  
        }
    }
}

这就是我需要帮助的地方。我如何在窗口初始化时执行此操作,或者在其他地方执行此操作以避免混淆更好?有没有更好的方法来做我正在尝试的一切?您还需要更多代码来帮助解答吗?谢谢!

1 个答案:

答案 0 :(得分:1)

所以我们将更多地使用WPF方法

从定义转换器类开始

class HasTennantConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Tennant tennant = values[0] as Tennant;
        Property property = values[1] as Property;
        return property.hasTennant(tennant);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后在您的XAML中将此转换器添加到您的资源

<l:HasTennantConverter x:Key="HasTennantConverter"/>

并将此绑定到Style Style或Template

行中的CheckBox

我使用Window作为我的相对源来检索CurrentProperty,你可以选择适当的绑定来检索它。

<CheckBox>
    <CheckBox.IsChecked>
        <MultiBinding Converter="{StaticResource HasTennantConverter}" Mode="OneWay">
            <Binding />
            <Binding Path="DataContext.CurrentProperty" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}"/>
        </MultiBinding>
    </CheckBox.IsChecked>
</CheckBox>

这个mutlibinding会将Tennant和CurrentProperty发送到转换器,逻辑将在转换器中检查,并根据你的逻辑返回true或false,这将检查或取消选中CheckBox。