0

私はの(データコンテキストは別のものです)を持っuserControlているので、コレクションのコレクションに設定すると、階層ビューを見ることができます。GridViewGridViewsGridViewGridViewitemssource

例えば:

親コレクションはList<ClassRoom>であり、親コレクションにはProperty List<Student>

上記のクラスは定義されており、UserControlを使用するためにクラスを変更することはできません(モデルレイヤーにあると見なされます)。

UserControlを開発しているので、というプロパティを定義しましたbool ShowChildItems

ShowChildItemsがfalseに設定されている場合、childGridViewをにしたいと思いますCollapsed

ユーザーコントロールのプロパティをchildGridView.Visisbilityにバインドするにはどうすればよいですか。(ShowChildItemsプロパティ値は、UserControlのインスタンスに応じて、実行時に変更される場合があります)

4

3 に答える 3

2

すべての XAML フレームワークで変更できないモデル レイヤー アイテムを回避する方法は、ClassRoom リストに実際にバインドしない MVVM パターンを使用することですが、ClassroomViewModel と呼ばれる別のタイプを作成して、クラスルーム リストを駆動するために必要なプロパティとメソッドを追加します。見る。

それができたら、呼び出された ClassroomViewModel にプロパティを追加できます。たとえば、StudentListVisibility です。次に、ユーザー コントロールがバインドするメイン ビュー モデルには、ShowChildItems プロパティと Classrooms リスト プロパティがあります。ユーザー コントロールは、その ShowChildItems 依存関係プロパティをビュー モデルの ShocChildItems バインド可能プロパティにバインドし、ShowChildItems 値の変更時にビュー モデルは ClassroomViewModel 項目のリストを反復処理して、それらの StudentListVisibility を適切に設定します。もちろん、StudentListVisibility は (子) GridView.Visibility プロパティにバインドされます。

とは言っても、GridView をネストすることは、ユーザー エクスペリエンスとエンジニアリングの両方の観点から見て、悪い設計のように思えます。おそらく、より良い解決策は、SemanticZoom コントロールを使用し、教室にバインドされた GridView をズームアウト ビューに使用し、GridView を教室ごとにグループ化された生徒と共にズームイン ビューに使用することです。

于 2013-01-20T04:55:26.897 に答える
2

あなたの子供のを管理するShowChildItemsプロパティをあなたに持たせるには、最初にそれを にする必要があります:UserControlVisibilityGridViewDependencyProperty

public static readonly DependencyProperty ShowChildItemsProperty =
    DependencyProperty.Register("showChildItems", typeof (bool), typeof (MyUserControl), new PropertyMetadata(true));

public bool ShowChildItems
{
    get { return (bool) GetValue(ShowChildItemsProperty); }
    set { SetValue(ShowChildItemsProperty, value); }
}

の内部では、次の構文を使用して をこのプロパティにUserControlバインドします。この方法では、 が何にバインドされているかは問題ではありません。GridView VisibilityElementNameGridView DataContext

<GridView Visibility="{Binding ShowChildItems, ElementName=ControlRoot, Converter={StaticResource VisibilityConverter}}" ItemsSource="{Binding ChildItems}">

これを機能させるには、名前を のルート ノードに設定する必要がありUserControlます (残りの属性は省略しました)。

<UserControl
    x:Name="ControlRoot">

また、コンバーターを使用してboolプロパティをバインドしましたVisibility:

<UserControl.Resources>
    <local:BoolToVisibilityConverter x:Key="VisibilityConverter" />
</UserControl.Resources>

これはそのコードです:

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (!(value is bool)) return Visibility.Collapsed;

        return (bool) value ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

これがあなたが求めていたものであることを願っています。あなたの質問に基づいて、私はよくわかりません。

于 2013-01-20T07:47:25.480 に答える
0

Visibility属性はbool型ではありません。childGridView.VisibilityをタイプのプロパティにバインドしようとしましたVisibilityか?このような:

private bool _showChildItems;
public Visibility showChildItems
{
    get
    {
        if (_showChildItems)
            return System.Windows.Visibility.Visible;
        else
            return System.Windows.Visibility.Collapsed;
    }
}
于 2013-01-20T04:20:36.197 に答える