WPF 中不调用 ValueConverter 转换方法

我正在尝试使用 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();

        }

    }

PS:我尝试过内置的 BooleanToVisibilityConverter,以及通过继承 MarkupExtension 类和略有不同的使用方法编写我的转换器。(带有 MarkupExtension 的 IValueConverter)


值转换器如下:


  [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);

因此,所有属性都已正确绑定,但值转换器不起作用。


一只斗牛犬
浏览 222回答 1
1回答

FFIVE

默认情况下ADataGridColumn不会继承任何内容DataContext,因此您的绑定会失败,这就是转换器从未被调用的原因。这与 ReactiveUI 无关。public class BindingProxy : Freezable{    protected override Freezable CreateInstanceCore()    {        return new BindingProxy();    }    public object Data    {        get { return (object)GetValue(DataProperty); }        set { SetValue(DataProperty, value); }    }    public static readonly DependencyProperty DataProperty =        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));}XAML:<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}}"/>
打开App,查看更多内容
随时随地看视频慕课网APP