为了账号安全,请及时绑定邮箱和手机立即绑定

WPF 中不调用 ValueConverter 转换方法

WPF 中不调用 ValueConverter 转换方法

C#
一只斗牛犬 2023-09-16 16:02:34
我正在尝试使用 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);因此,所有属性都已正确绑定,但值转换器不起作用。
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

默认情况下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}}"/>


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 221 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信