如何调试转换器

时间:2014-08-10 13:38:45

标签: c# wpf xaml

我有这个转换器

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.SelectedItems转换为List<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)?

2 个答案:

答案 0 :(得分:2)

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

如果你想将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 属性。因此,无论何时更改,都不会发出通知。因此,转换器永远不会再次命中。

  

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

只有在初始化窗口时,才会启动转换器。那时SelectedItems集合是空的。

答案 1 :(得分:1)

您的属性(SelectedItems)不是DependencyProperty,也不会引发INotifyPropertyChanged

因此,当您设置属性时,WPF永远不会找到。