【问题标题】:ValueConverter Convert Methods are not invoked in WPF在 WPF 中不调用 ValueConverter 转换方法
【发布时间】: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。如果BackPayCategoryVisibleDataGridComboBoxColumn 的DataContext 的属性(我无法知道是否是这种情况),并且如果DataGridComboBoxColumn 的DataContext 引发PropertyChanged"BackPayCategoryVisible" 作为属性名称时它应该,你的代码会工作。
  • "for 正确的属性名称何时应该" - 但我也无法知道是否会发生这种情况。问题当然不在于您向我们展示的任何代码。内置的BooleanToVisibilityConverter 也可以正常工作。
  • @EdPlunkett,我对所有视图都使用 ReactiveUi 绑定,但对于 DataGridColumns,它们的数据上下文是 ItemsSource 项,而对于列的绑定,我必须使用 WPF 绑定。我将添加更多代码来提问。
  • 我无法重现该问题。祝你好运。
  • 在运行时,在 Visual Studio 的“输出”窗格中查找绑定错误。您可以将 PresentationTraceSources.TraceLevel=High 添加到损坏的绑定中,它会在“输出”窗格中为您提供更多详细信息,说明它在解决源属性时遇到问题的具体方式和位置。

标签: c# wpf reactive


【解决方案1】:

默认情况下,DataGridColumn 不会继承任何 DataContext,因此您的绑定失败,这就是永远不会调用转换器的原因。这与 ReactiveUI 无关。

您可以按照blog 帖子中的建议使用Freezable 使绑定生效:

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}}"/>

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2020-08-27
    • 2010-10-11
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多