我的DataGrid
ObservableCollection
类型为Tennant
(请原写拼写,我最终会将其修复)为ItemsSource
。 Tennant
课程由姓名,电子邮件,电话号码和职业组成。然而,在DataGrid中,我有一组所有Tennants在程序中只有他们的名字,一个复选框,以显示他们是否生活或曾经生活在正在编辑的当前Property
,还有一个单选按钮这表明它是Tennant
的当前Property
。这是一个屏幕截图:
我的问题出在Lived Here专栏。这不属于Tennant
或Property
类的任何部分。它改为有两个事件(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.
}
}
}
}
这就是我需要帮助的地方。我如何在窗口初始化时执行此操作,或者在其他地方执行此操作以避免混淆更好?有没有更好的方法来做我正在尝试的一切?您还需要更多代码来帮助解答吗?谢谢!
答案 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。