我已经对此做了很多阅读,但我显然仍然遗漏了一些东西。我可以通过将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')
答案 0 :(得分:1)
我不会绑定ObservableCollection
并重新初始化它。即使使用INotifyPropertyChanged
和OnPropertyChanged
。
请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
,但你有这么多的可能性。与Count
,HasItems
,`
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();
一样。我想你明白了。