ItemsSource更改时ListView不更新

时间:2017-06-19 20:19:17

标签: c# wpf xaml

我已经对此做了很多阅读,但我显然仍然遗漏了一些东西。我可以通过将ObservableCollection传递给类构造函数来解决它,但我想了解它失败的原因。输出窗口中没有任何内容表示绑定已损坏。我在ObservableCollection上的可见性转换器<>财产工作正常。这是XAML。问题在于DetailsListBox

<StackPanel Grid.Column="2" >
    <Label 
        Name="DetailsLabel" Foreground="Black"  Height="20" Width="Auto" 
        FontSize="8"
        Content="{Binding Description, Converter={StaticResource DetailConverter}}"
        Visibility="{Binding Path=DetailsList, Converter={StaticResource DetailsVisConverter}}"
        Background="Transparent"
        Margin="0" Padding="0"
        HorizontalAlignment="Center">
    </Label>
    <ListBox 
        Name="DetailsList" 
        ItemsSource="{Binding Path=DetailsList}"
        Visibility="{Binding Path=DetailsList, Converter={StaticResource DetailsVisConverter}}" 
        >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=.}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

这是创建类实例并设置ObservableCollection的代码隐藏:

    NodeAsThumb hosthumb = CreateClusterNodeAsThumb(host);
    hosthumb.DataContext = hosthumb;
    ObservableCollection<string> PortDetails = new ObservableCollection<string>();
    foreach (PortResult pr in hostports) { PortDetails.Add(pr.Interface); }
    hosthumb.DetailsList = PortDetails;

这是一些类定义,包括PropertyChanged处理程序。 OnPropertyChanged正在被调用。我最初将DetailsList作为List&lt;&gt;,但读取它应该是ObservableCollection&lt;&gt;因为它会触发ICollectionChanged,但这似乎并没有发生。

public  class NodeAsThumb :FabricThumb, INotifyPropertyChanged
{

    private ObservableCollection<string> _detailsList = null;
    public ObservableCollection<string> DetailsList { get { return _detailsList; } set { _detailsList = value; OnPropertychanged("DetailsList"); } }


  // I have verified that this gets fired when DetailsList is assigned to
 public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }


    private void OnPropertychanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

最后,VisiblityConverter确实有效,并且还绑定到DetailsList。当它为null时,我想隐藏它。我认为它可能是VisibilityConverter仍然崩溃,所以我禁用了它,但结果总是空列表。

public class DetailsListVisiblityConverter : IValueConverter
{

    public Object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Collapsed;
        }
        else
        {
            return Visibility.Visible;
        }
    }

    public Object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将TraceLevel设置为High后,这是输出窗口:

System.Windows.Data Warning: 56 : Created BindingExpression  (hash=1635228) for Binding (hash=30787047)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=1635228): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=1635228): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=1635228): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=59834015)
System.Windows.Data Warning: 67 : BindingExpression (hash=1635228): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=1635228): Found data context element: ListBox (hash=59834015) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=1635228): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=1635228): Resolve source deferred
System.Windows.Data Warning: 56 : Created BindingExpression (hash=61434729) for Binding (hash=30787047)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=61434729): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=61434729): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=61434729): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=51565323)
System.Windows.Data Warning: 67 : BindingExpression (hash=61434729): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=61434729): Found data context element: ListBox (hash=51565323) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=61434729): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=61434729): Resolve source deferred
System.Windows.Data Warning: 56 : Created BindingExpression (hash=27129916) for Binding (hash=30787047)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=27129916): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=27129916): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=27129916): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=40297137)
System.Windows.Data Warning: 67 : BindingExpression (hash=27129916): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=27129916): Found data context element: ListBox (hash=40297137) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=27129916): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=27129916): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=1635228): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=1635228): Found data context element: ListBox (hash=59834015) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=1635228): Activate with root item NodeAsThumb (hash=46479497)
System.Windows.Data Warning: 107 : BindingExpression (hash=1635228):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=1635228): Replace item at level 0 with NodeAsThumb (hash=46479497), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=1635228): GetValue at level 0 from NodeAsThumb (hash=46479497) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=1635228): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=1635228): TransferValue - using final value <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=61434729): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=61434729): Found data context element: ListBox (hash=51565323) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=61434729): Activate with root item NodeAsThumb (hash=1807185)
System.Windows.Data Warning: 107 : BindingExpression (hash=61434729):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=61434729): Replace item at level 0 with NodeAsThumb (hash=1807185), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=61434729): GetValue at level 0 from NodeAsThumb (hash=1807185) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=61434729): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=61434729): TransferValue - using final value <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=27129916): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=27129916): Found data context element: ListBox (hash=40297137) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=27129916): Activate with root item NodeAsThumb (hash=22613965)
System.Windows.Data Warning: 107 : BindingExpression (hash=27129916):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=27129916): Replace item at level 0 with NodeAsThumb (hash=22613965), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=27129916): GetValue at level 0 from NodeAsThumb (hash=22613965) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=27129916): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=27129916): TransferValue - using final value <null>
'FabricAnalyzer.exe' (CLR v4.0.30319: FabricAnalyzer.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemCore\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemCore.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
System.Windows.Data Warning: 56 : Created BindingExpression (hash=63575268) for Binding (hash=22674843)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=63575268): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=63575268): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=63575268): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=66716242)
System.Windows.Data Warning: 67 : BindingExpression (hash=63575268): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=63575268): Found data context element: ListBox (hash=66716242) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=63575268): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=63575268): Resolve source deferred
System.Windows.Data Warning: 56 : Created BindingExpression (hash=55244468) for Binding (hash=22674843)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=55244468): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=55244468): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=55244468): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=28507895)
System.Windows.Data Warning: 67 : BindingExpression (hash=55244468): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=55244468): Found data context element: ListBox (hash=28507895) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=55244468): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=55244468): Resolve source deferred
System.Windows.Data Warning: 56 : Created BindingExpression (hash=53268321) for Binding (hash=22674843)
System.Windows.Data Warning: 58 :   Path: 'DetailsList'
System.Windows.Data Warning: 60 : BindingExpression (hash=53268321): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=53268321): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=53268321): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=20831783)
System.Windows.Data Warning: 67 : BindingExpression (hash=53268321): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=53268321): Found data context element: ListBox (hash=20831783) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=53268321): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=53268321): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=63575268): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=63575268): Found data context element: ListBox (hash=66716242) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=63575268): Activate with root item NodeAsThumb (hash=19140135)
System.Windows.Data Warning: 107 : BindingExpression (hash=63575268):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=63575268): Replace item at level 0 with NodeAsThumb (hash=19140135), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=63575268): GetValue at level 0 from NodeAsThumb (hash=19140135) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=63575268): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=63575268): TransferValue - using final value <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=55244468): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=55244468): Found data context element: ListBox (hash=28507895) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=55244468): Activate with root item NodeAsThumb (hash=31430389)
System.Windows.Data Warning: 107 : BindingExpression (hash=55244468):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=55244468): Replace item at level 0 with NodeAsThumb (hash=31430389), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=55244468): GetValue at level 0 from NodeAsThumb (hash=31430389) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=55244468): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=55244468): TransferValue - using final value <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=53268321): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=53268321): Found data context element: ListBox (hash=20831783) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=53268321): Activate with root item NodeAsThumb (hash=35867003)
System.Windows.Data Warning: 107 : BindingExpression (hash=53268321):   At level 0 using cached accessor for NodeAsThumb.DetailsList: RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 104 : BindingExpression (hash=53268321): Replace item at level 0 with NodeAsThumb (hash=35867003), using accessor RuntimePropertyInfo(DetailsList)
System.Windows.Data Warning: 101 : BindingExpression (hash=53268321): GetValue at level 0 from NodeAsThumb (hash=35867003) using RuntimePropertyInfo(DetailsList): <null>
System.Windows.Data Warning: 80 : BindingExpression (hash=53268321): TransferValue - got raw value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=53268321): TransferValue - using final value <null>
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=WWPN; DataItem=null; target element is 'DataGridTextColumn' (HashCode=30423852); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=SwitchName; DataItem=null; target element is 'DataGridTextColumn' (HashCode=33040847); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=WWPN; DataItem=null; target element is 'DataGridTextColumn' (HashCode=19299281); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=SwitchName; DataItem=null; target element is 'DataGridTextColumn' (HashCode=47325326); target property is 'Visibility' (type 'Visibility')

1 个答案:

答案 0 :(得分:1)

我不会绑定ObservableCollection并重新初始化它。即使使用INotifyPropertyChangedOnPropertyChanged

Clear() ObservableCollection Property并使用Count Visibility来申请public class MyClass : BaseViewModel { public System.Collections.ObjectModel.ObservableCollection<string> MyCollection { get; } public MyClass() { MyCollection = new System.Collections.ObjectModel.ObservableCollection<string>(); MyCollection.CollectionChanged += MyCollection_CollectionChanged; } public bool IsEmpty { get { return MyCollection.Count == 0; } } public void RefillMyCollection(IEnumerable<string> values) { MyCollection.Clear(); foreach(string value in values) { MyCollection.Add(value); } } private void MyCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { OnPropertyChanged("IsEmpty"); } }

IValueConverter

你需要另一个IsEmpty,但你有这么多的可能性。与CountHasItems` Dictionary<string, string> motRap = new Dictionary<string, string>(); Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application(); Document document = application.Documents.Open("monfichiertxt.docx"); // Loop through all words in the document. int count = document.Words.Count; for (int i = 1; i <= count; i++) { // Write the word. string text = document.Words[i].Text; //motRapport.Add(text); motRap.Add(text, "blabla"); } // Close word. application.Quit(); 一样。我想你明白了。