ControlTemplate
カスタム コントロール用に を作成しましたMyControl
。
MyControl
次のプロパティから派生しSystem.Windows.Controls.Control
、定義しますpublic ObservableCollection<MyControl> Children{ get; protected set; }
。
ネストされた子コントロールを表示するには、で囲まれたItemsControl
( ) を使用しています。子コントロールがない場合は、.StackPanel
GroupBox
GroupBox
アプリケーションの起動時にすべて正常に動作します。Children プロパティに最初に少なくとも 1 つの要素が含まれていた場合、グループ ボックスと子コントロールが表示されます。それ以外の場合は非表示になります。
ユーザーが子コントロールを空のコレクションに追加すると、問題が発生します。のGroupBox
可視性はまだ折りたたまれています。最後の子コントロールがコレクションから削除されると、同じ問題が発生します。はGroupBox
まだ表示されます。もう 1 つの症状は、HideEmptyEnumerationConverter
コンバーターが呼び出されないことです。空でないコレクションへの子コントロールの追加/削除は、期待どおりに機能します。
次のバインディングの何が問題になっていますか? 私がバインドしているコレクションのタイプはObservableCollection
.
<!-- Converter for hiding empty enumerations -->
<Common:HideEmptyEnumerationConverter x:Key="hideEmptyEnumerationConverter"/>
<!--- ... --->
<ControlTemplate TargetType="{x:Type MyControl}">
<!-- ... other stuff that works ... -->
<!-- Child components -->
<GroupBox Header="Children"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Children, Converter={StaticResource hideEmptyEnumerationConverter}}">
<ItemsControl ItemsSource="{TemplateBinding Children}"/>
</GroupBox>
</ControlTemplate>
.
[ValueConversion(typeof (IEnumerable), typeof (Visibility))]
public class HideEmptyEnumerationConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int itemCount = ((IEnumerable) value).Cast<object>().Count();
return itemCount == 0 ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
もう 1 つの、より一般的な質問: 皆さんはどのようにバインディングをデバッグしていますか? これ(http://bea.stollnitz.com/blog/?p=52)を見つけましたが、それでも非常に難しいと思います。
助けや提案をいただければ幸いです。