C# 在WPF中不调用ValueConverter转换方法
我正在尝试使用ValueConverter。 所有绑定(包括DataGrid内容)都正常工作,但我不能将值转换器应用于DataGridColumns,也不能应用于其他字段,因为它的方法根本没有被调用 可能出现问题的地方可能是,我们正在使用反应式UI作为MVVM框架,因此它可能是问题的根源。我通过反应式UI绑定设置DataGrid的源项 但我试着在视图上设置如下内容:C# 在WPF中不调用ValueConverter转换方法,c#,wpf,reactive,C#,Wpf,Reactive,我正在尝试使用ValueConverter。 所有绑定(包括DataGrid内容)都正常工作,但我不能将值转换器应用于DataGridColumns,也不能应用于其他字段,因为它的方法根本没有被调用 可能出现问题的地方可能是,我们正在使用反应式UI作为MVVM框架,因此它可能是问题的根源。我通过反应式UI绑定设置DataGrid的源项 但我试着在视图上设置如下内容: public partial class OrderTimeSheetUserControl : OrderTimeSheetB
public partial class OrderTimeSheetUserControl : OrderTimeSheetBaseUserControl
{
public OrderTimeSheetUserControl()
{
this.DataContext = ViewModel; // Set data context in case it may have helped (but it did not)
InitializeComponent();
}
}
附言:我尝试过内置BooleantVisibilityConverter,也尝试过用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();
}
}
<userControls:OrderTimeSheetBaseUserControl.Resources>
<wpfValueConverters:BoolToCollapsedVisibilityValueConverter x:Key="Conv" />
this.OneWayBind(ViewModel,
viewModel => viewModel.Employees,
view => view.PersonsInOrderDataGrid.ItemsSource)
.DisposeWith(disposable);
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
...
<DataGridTextColumn Header="Backpay Cat." Binding="{Binding Price}"
Visibility="{Binding Data.BackPayCategoryVisible,
Converter={StaticResource Conv},
Source={StaticResource proxy}}"/>
及其在XAML页面中的用法:
[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();
}
}
<userControls:OrderTimeSheetBaseUserControl.Resources>
<wpfValueConverters:BoolToCollapsedVisibilityValueConverter x:Key="Conv" />
this.OneWayBind(ViewModel,
viewModel => viewModel.Employees,
view => view.PersonsInOrderDataGrid.ItemsSource)
.DisposeWith(disposable);
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
...
<DataGridTextColumn Header="Backpay Cat." Binding="{Binding Price}"
Visibility="{Binding Data.BackPayCategoryVisible,
Converter={StaticResource Conv},
Source={StaticResource proxy}}"/>
因此,所有属性都已正确绑定,但值转换器不起作用。默认情况下,
DataGridColumn
不会继承任何DataContext
,因此绑定失败,这就是从未调用转换器的原因。这与ReactiveUI无关
您可以使用本文建议的Freezable
使绑定正常工作:
XAML:
[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();
}
}
<userControls:OrderTimeSheetBaseUserControl.Resources>
<wpfValueConverters:BoolToCollapsedVisibilityValueConverter x:Key="Conv" />
this.OneWayBind(ViewModel,
viewModel => viewModel.Employees,
view => view.PersonsInOrderDataGrid.ItemsSource)
.DisposeWith(disposable);
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
...
<DataGridTextColumn Header="Backpay Cat." Binding="{Binding Price}"
Visibility="{Binding Data.BackPayCategoryVisible,
Converter={StaticResource Conv},
Source={StaticResource proxy}}"/>
...
“设置数据上下文,以防它可能有帮助(但没有帮助)”。因此,无论您是否拥有viewmodel,所有与viewmodel属性的绑定都正常工作?请如果BackPayCategoryVisible
是DataGridComboxColumn
的DataContext的一个属性(我无法知道是否是这种情况),并且DataGridComboxColumn
的DataContext在应该时为属性名称引发属性更改“BackPayCategoryVisible”
,您的代码将起作用。“在应该的时候找到正确的属性名”——但我也无法知道是否会发生这种情况。问题当然不在您向我们展示的任何代码中。内置的BooleanToVisibilityConverter
也可以正常工作。@EdPlunkett,我对所有视图都使用了ReactiveUi绑定,但对于DataGridColumns,它们的数据上下文是ItemsSource item,对于列的绑定,我必须使用WPF绑定。我将在问题中添加更多代码。我无法从中复制问题。祝您好运。在运行时,在Visual Studio的“输出”窗格中查找绑定错误。您可以将PresentationTraceSources.TraceLevel=High添加到已断开的绑定中,它将在“输出”窗格中为您提供更多详细信息,说明解析source属性时遇到问题的确切方式和位置。