如何调试转换器

本文关键字:转换器 调试 何调试 | 更新日期: 2023-09-27 18:17:16

我有这个转换器

public class SelectedItemsTipoArchivoRipsToObservable : BaseConverter, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var SelectedItems = value as IList;
        List<MyType> Seleccionados = SelectedItems.Cast<MyType>().ToList();
        return Seleccionados;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我用它来转换ListView.SelectedItemsList<T>我用这个XAML

<ListView x:Name="LstTiposArchivos" Grid.Row="4" Grid.ColumnSpan="2" ItemsSource="{Binding TiposDeArchivos}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding SeleccionarArchivosCommand}" CommandParameter="{Binding ElementName=LstTiposArchivos,Path=SelectedItems,Converter={StaticResource ResourceKey=SelectedItemsToObservable}}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <ListView.View>
        <GridView>
           .....
        </GridView>
    </ListView.View>
</ListView>

和在我的ICommand执行:

public void ExecuteSeleccionarArchivos(object p)
{
    TiposDeArchivosaProcesar = (List<MyType>)p;
}

我有两个问题:

1-我如何调试我的转换器?原因:我在它上面有一个断点,但是它只在初始化窗口时停止。

2-为什么这个转换器总是返回一个空列表(计数总是0)?

如何调试转换器

首先你根本不需要转换器。

如果您想将SelectedItems集合类型转换为您的类型列表,您可以直接在命令执行处理程序中这样做:

TiposDeArchivosaProcesar = (p as IList).Cast<MyType>().ToList();

如果你期望的值不是你的列表,你也可以在方法中做安全检查。

var list = p as IList;
if(list != null)
{
   TiposDeArchivosaProcesar = list.OfType<MyType>().ToList();
}

现在,对于你的问题:

我如何调试我的转换器?原因:我在它上面有一个断点,但是它只在初始化窗口时停止。

SLaks是部分正确的。问题不在于属性TiposDeArchivosaProcesar,而在于SelectedItems

我只是交叉检查,SelectedItems不是一个依赖属性SelectedItem是一个DP,这意味着你可以绑定到SelectedItem,但不能与SelectedItems。

对于转换器来说,它需要某种通知,即有界值已经改变,但由于SelectedItems不是DP,也不是 INPC 属性。因此,无论何时它发生改变,都不会引发通知。因此,转换器再也不会命中。

为什么这个转换器总是返回一个空列表(计数总是0)?

转换器将只被击中一次当你的窗口将被初始化。当时SelectedItems集合是空的

你的属性(SelectedItems)不是一个DependencyProperty,也不会引发INotifyPropertyChanged

因此,当您设置属性时,WPF永远不会发现