Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 通过转换器绑定CollectionViewSource在添加项时不触发转换器_C#_Wpf_Binding_Solid Principles - Fatal编程技术网

C# 通过转换器绑定CollectionViewSource在添加项时不触发转换器

C# 通过转换器绑定CollectionViewSource在添加项时不触发转换器,c#,wpf,binding,solid-principles,C#,Wpf,Binding,Solid Principles,我需要在文本块中显示CollectionViewSource中非特定类型的元素数。我试图通过在TextBlock的Text属性和集合之间添加一个转换器来实现这一点,但是当我将项目添加到绑定到CollectionViewSource的ObservableCollection时,不会触发转换器。集合确实会被更改,因为如果我直接绑定到Count属性,这将触发转换器 这是CollectionViewSource: <CollectionViewSource x:Key="PatientRelate

我需要在文本块中显示CollectionViewSource中非特定类型的元素数。我试图通过在TextBlock的Text属性和集合之间添加一个转换器来实现这一点,但是当我将项目添加到绑定到CollectionViewSource的ObservableCollection时,不会触发转换器。集合确实会被更改,因为如果我直接绑定到Count属性,这将触发转换器

这是CollectionViewSource:

<CollectionViewSource x:Key="PatientRelatedWorkflowsCollection"
                              Source="{Binding PatientRelatedWorkflows}"
                              x:Uid="68cbfcf5481c43bdb83d6b31fe8ddc34">
            <CollectionViewSource.SortDescriptions>
                <my:SortDescription PropertyName="Patient.LastName" x:Uid="cf8cdd34c5d14c049a27e46848aca60d" />
            </CollectionViewSource.SortDescriptions>
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Patient"
                                          Converter="{StaticResource WorkflowPatientGroupConverter}"
                                          x:Uid="d03e9b90df654454b5f5f7a8ee9cb1bf">
                </PropertyGroupDescription>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>

以下是装订:

<TextBlock Text="{Binding Converter={StaticResource CountNonConsultationWorkflowsConverter}}" />

这是转换器:

public class CountNonConsultationWorkflowsConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var workflowItems = value as ReadOnlyObservableCollection<Object>;
        if (workflowItems != null)
        {
            return workflowItems.Count(item => (item as WorkflowDataViewModel) != null && (item as WorkflowDataViewModel).WorkflowType != WorkflowType.ConsultPatient).ToString(CultureInfo.InvariantCulture);
        }
        return "0";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类计数非协商工作流转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var workflowItems=值为ReadOnlyObservableCollection;
if(workflowItems!=null)
{
返回workflowItems.Count(item=>(item作为WorkflowDataViewModel)!=null&&(item作为WorkflowDataViewModel.WorkflowType!=WorkflowType.ConsultPatient).ToString(CultureInfo.InvariantCulture);
}
返回“0”;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
注意:我通过使用多值绑定和多值转换器(如下所示)使其工作。这一个可行,因为“Count”属性确实触发了属性更改,但我确实觉得这有点像黑客,希望有一个更好的解决方案

   <TextBlock.Text>
                <MultiBinding Converter="{StaticResource CountNonConsultationWorkflowsConverter}">
                    <Binding x:Uid="eb26d2c0bdb94d18ab48d8e25ce5f5ea" />
                    <Binding Path="Count" x:Uid="5555c981fda94bc6ad823c2f1e94b0f1" />
                </MultiBinding>
            </TextBlock.Text>


你知道我怎样才能做得更好吗?非常感谢您的帮助。

您可以将UpdateSourceTrigger设置为Explicit,并在每次添加项目时进行更新。

我需要与MVVM模式保持一致,因此我不想访问代码隐藏中的控件。如果您遵循MVVM模式,我会将TextBlock绑定到ViewModel中特定类型的属性CountOfCertainType并删除转换器。