【发布时间】:2019-08-22 22:01:28
【问题描述】:
我正在尝试使用 ValueConverter。 所有绑定,包括 DataGrid 内容都正常工作,但我不能将值转换器应用于 DataGridColumns,也不能应用于其他字段,因为它的方法根本没有被调用。
可能有问题的地方可能是我们使用 Reactive UI 作为 MVVM 框架,因此它可能是问题的根源。我正在通过反应式 UI 绑定设置 DataGrid 的项目源。
但我试图在视图上设置类似的东西:
public partial class OrderTimeSheetUserControl : OrderTimeSheetBaseUserControl
{
public OrderTimeSheetUserControl()
{
this.DataContext = ViewModel; // Set data context in case it may have helped (but it did not)
InitializeComponent();
}
}
P.S.:我尝试了内置的 BooleanToVisibilityConverter,以及使用 MarkupExtension 类的继承和稍微不同的使用方法编写我的转换器。 (IValueConverter with MarkupExtension)
下面的值转换器:
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolToCollapsedVisibilityValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool == false)
{
throw new NotSupportedException($"Conversion from {value.GetType().Name} is not supported by {nameof(BoolToCollapsedVisibilityValueConverter)}.");
}
var boolValue = (bool) value;
return boolValue ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
它在 XAML 页面中的用法:
<userControls:OrderTimeSheetBaseUserControl.Resources>
<wpfValueConverters:BoolToCollapsedVisibilityValueConverter x:Key="Conv" />
<DataGrid>
<DataGrid.Columns>
<DataGridComboBoxColumn Visibility="{Binding BackPayCategoryVisible, Converter={StaticResource Conv}}" Header="Backpay Cat."/>
</DataGrid.Columns>
</DataGrid>
xaml.cs 中 DataGrid 的 ItemsSource 的反应式 UI 绑定:
this.OneWayBind(ViewModel,
viewModel => viewModel.Employees,
view => view.PersonsInOrderDataGrid.ItemsSource)
.DisposeWith(disposable);
因此,所有属性都已正确绑定,但值转换器不起作用。
【问题讨论】:
-
“设置数据上下文以防它可能有帮助(但它没有)”。因此,无论您是否有视图模型,您对视图模型属性的所有绑定都可以正常工作?请provide a reproducible example。如果
BackPayCategoryVisible是DataGridComboBoxColumn的DataContext 的属性(我无法知道是否是这种情况),并且如果DataGridComboBoxColumn的DataContext 引发PropertyChanged和"BackPayCategoryVisible"作为属性名称时它应该,你的代码会工作。 -
"for 正确的属性名称何时应该" - 但我也无法知道是否会发生这种情况。问题当然不在于您向我们展示的任何代码。内置的
BooleanToVisibilityConverter也可以正常工作。 -
@EdPlunkett,我对所有视图都使用 ReactiveUi 绑定,但对于 DataGridColumns,它们的数据上下文是 ItemsSource 项,而对于列的绑定,我必须使用 WPF 绑定。我将添加更多代码来提问。
-
我无法重现该问题。祝你好运。
-
在运行时,在 Visual Studio 的“输出”窗格中查找绑定错误。您可以将 PresentationTraceSources.TraceLevel=High 添加到损坏的绑定中,它会在“输出”窗格中为您提供更多详细信息,说明它在解决源属性时遇到问题的具体方式和位置。