Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中不调用ValueConverter转换方法_C#_Wpf_Reactive - Fatal编程技术网

C# 在WPF中不调用ValueConverter转换方法

C# 在WPF中不调用ValueConverter转换方法,c#,wpf,reactive,C#,Wpf,Reactive,我正在尝试使用ValueConverter。 所有绑定(包括DataGrid内容)都正常工作,但我不能将值转换器应用于DataGridColumns,也不能应用于其他字段,因为它的方法根本没有被调用 可能出现问题的地方可能是,我们正在使用反应式UI作为MVVM框架,因此它可能是问题的根源。我通过反应式UI绑定设置DataGrid的源项 但我试着在视图上设置如下内容: public partial class OrderTimeSheetUserControl : OrderTimeSheetB

我正在尝试使用ValueConverter。 所有绑定(包括DataGrid内容)都正常工作,但我不能将值转换器应用于DataGridColumns,也不能应用于其他字段,因为它的方法根本没有被调用

可能出现问题的地方可能是,我们正在使用反应式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();
        }
    }
附言:我尝试过内置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属性时遇到问题的确切方式和位置。