指定 DataContext 会导致 Xaml 看不到它不是 null?
Specifying DataContext can cause Xaml to not see it not null when it is?
我在 Xaml 端的 Wpf 应用程序中遇到了一个奇怪的问题,我没有得到解释。
场景:我有一个数据网格绑定到一些复杂的 classes,一些行有一个“详细信息”class 和一些额外的数据(代码中的 VSmtp
),而其他人没有。我的计划是在用户选择包含额外数据的行时显示一个小表格。
为此,我制作了一个自定义转换器,如果绑定对象不为空,则启用控件的可见性:
public class NotNullValueToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我使用此转换器将表单的可见性绑定到数据网格的选定项(代码中的SelectedItem
),对其进行了测试并且它完全按预期工作,仅当用户选择时才会显示表单一行,那一行有额外的 class set
<local:ucSmtpForm
Visibility="{Binding SelectedItem.VSmtp, Converter={StaticResource NotNullValueToVisibilityConverter}}"
>
</local:ucSmtpForm>
对结果很满意,我开始将数据绑定到表格,但是当我这样做并再次测试时,我发现表格现在出现在每一行上,即使那些没有 VSmtp
class
<local:ucSmtpForm
Visibility="{Binding SelectedItem.VSmtp, Converter={StaticResource NotNullValueToVisibilityConverter}}"
DataContext="{Binding SelectedItem.VSmtp}"
>
</local:ucSmtpForm>
我不知道为什么表单现在在没有 VSmtp
class 的行上可见,而在它工作正常之前,调试代码确认 属性 为空它应该在哪里。
有人对此有解释吗?
我已经通过简单地将表单放入网格并将可见性绑定移动到它来解决了这个问题,现在可以按预期工作,但我想知道如果 DataContext 和可见性都是绑定在 UserControl 中,以便将来更好地了解情况。
万分感谢
在您明确设置 DataContext
之前,local:ucSmtpForm
的 DataContext
是 SomeViewModel
,它有 SelectedItem
属性.
当您将 local:ucSmtpForm
的 DataContext
设置为新的 SelectedItem.VSmtp
时,Visibility
的绑定被破坏,因为 VSmtp
没有 SelectedItem
属性。这应该有效:
<local:ucSmtpForm
Visibility="{Binding '.', Converter={StaticResource NotNullValueToVisibilityConverter}}"
DataContext="{Binding SelectedItem.VSmtp}"
>
</local:ucSmtpForm>
我在 Xaml 端的 Wpf 应用程序中遇到了一个奇怪的问题,我没有得到解释。
场景:我有一个数据网格绑定到一些复杂的 classes,一些行有一个“详细信息”class 和一些额外的数据(代码中的 VSmtp
),而其他人没有。我的计划是在用户选择包含额外数据的行时显示一个小表格。
为此,我制作了一个自定义转换器,如果绑定对象不为空,则启用控件的可见性:
public class NotNullValueToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我使用此转换器将表单的可见性绑定到数据网格的选定项(代码中的SelectedItem
),对其进行了测试并且它完全按预期工作,仅当用户选择时才会显示表单一行,那一行有额外的 class set
<local:ucSmtpForm
Visibility="{Binding SelectedItem.VSmtp, Converter={StaticResource NotNullValueToVisibilityConverter}}"
>
</local:ucSmtpForm>
对结果很满意,我开始将数据绑定到表格,但是当我这样做并再次测试时,我发现表格现在出现在每一行上,即使那些没有 VSmtp
class
<local:ucSmtpForm
Visibility="{Binding SelectedItem.VSmtp, Converter={StaticResource NotNullValueToVisibilityConverter}}"
DataContext="{Binding SelectedItem.VSmtp}"
>
</local:ucSmtpForm>
我不知道为什么表单现在在没有 VSmtp
class 的行上可见,而在它工作正常之前,调试代码确认 属性 为空它应该在哪里。
有人对此有解释吗?
我已经通过简单地将表单放入网格并将可见性绑定移动到它来解决了这个问题,现在可以按预期工作,但我想知道如果 DataContext 和可见性都是绑定在 UserControl 中,以便将来更好地了解情况。
万分感谢
在您明确设置 DataContext
之前,local:ucSmtpForm
的 DataContext
是 SomeViewModel
,它有 SelectedItem
属性.
当您将 local:ucSmtpForm
的 DataContext
设置为新的 SelectedItem.VSmtp
时,Visibility
的绑定被破坏,因为 VSmtp
没有 SelectedItem
属性。这应该有效:
<local:ucSmtpForm
Visibility="{Binding '.', Converter={StaticResource NotNullValueToVisibilityConverter}}"
DataContext="{Binding SelectedItem.VSmtp}"
>
</local:ucSmtpForm>