1

私の小さな目的は、動的な外出先でのコントロールの生成を実装し、VisibilityやIsEnabledなどのそれぞれのプロパティを関連付けることです。

コントロールはStackPanelに挿入する必要があります。また、いくつかの条件に基づいて、子ノードのプロパティが変更されます。私は次のnastedStackPanel構造を使用しました:

  1. 子の垂直方向の親StackPanel(フォームをシミュレートするためのラベルと入力フィールドのコレクション)
  2. 子の水平方向の子ノードStackPanel(ラベルと入力フィールド)

主なアイデアは、各ラベルごとに1つの入力フィールド(日付ピッカー、コンボ、テキストなど)しかないということです。その結果、複数のコントロールを持つラベルとグリッドを作成しました。コンバーターを介して入力コントロールのVisibilityプロパティとIsEnabledプロパティを操作します。

ここに質問があります:他の手段(より効率的/美的)によってこれらすべてを実装することは可能ですか?建設的な批判や提案は大歓迎です:)

前もって感謝します。

XAML:

<StackPanel Grid.Row="1" Orientation="Vertical">
    <ItemsControl ItemsSource="{Binding DataClass}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Margin="0, 5, 0, 0" >
                    <Label Content="{Binding KeyName}" Width="150"/>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="190"/>
                        </Grid.ColumnDefinitions>
                        <DatePicker Text="{Binding Value}"
                            Visibility="{Binding Type, Converter={StaticResource TypeVisiblity}, ConverterParameter='DateTime'}"
                            IsEnabled="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource VisibilityEnabled}}"/>
                        <ComboBox Text="{Binding Value}" 
                            Visibility="{Binding Type, Converter={StaticResource TypeVisiblity}, ConverterParameter='Lookup'}"
                            IsEnabled="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource VisibilityEnabled}}"/>
                        <TextBox Text="{Binding Value}" 
                            Visibility="{Binding Type, Converter={StaticResource TypeVisiblity}, ConverterParameter='Number'}"
                            IsEnabled="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource VisibilityEnabled}}"/>
                        <TextBox Text="{Binding Value}" 
                            Visibility="{Binding Type, Converter={StaticResource TypeVisiblity}, ConverterParameter='Text'}"
                            IsEnabled="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource VisibilityEnabled}}"/>
                    </Grid>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>

可視性コンバーター:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool isMatched;
        string type,
               controlType;

        // Safe Convert.
        type = System.Convert.ToString(value);
        controlType = System.Convert.ToString(parameter);

        if (string.IsNullOrEmpty(type) || string.IsNullOrEmpty(controlType))
        {
            return Visibility.Hidden;
        }

        // Check matching.
        isMatched = string.Equals(type, controlType, StringComparison.CurrentCultureIgnoreCase);

        return isMatched ? Visibility.Visible : Visibility.Hidden;
    }

IsEnabled Converter:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    Control control;

    control = value as Control;

    if (control == null)
    {
        return false;
    }

    return control.Visibility == Visibility.Visible;
}
4

2 に答える 2

0

DatePicker、ComboBox、TextBoxなどをユーザーインターフェイスとして持つユーザーコントロールを作成し、このユーザーコントロールの背後にあるコードで必要なすべてのロジックを実装します。依存関係プロパティを追加して、コンバーターなしでロジックを実装できます。

ユーザーコントロールをChildrenプロパティに追加することで、StackPanelに簡単に追加できます。

于 2012-12-04T13:56:56.037 に答える
0

を使用して、スタイルContentControlを設定しますContentTemplate

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <!-- Default Template -->
            <Setter Property="ContentTemplate" 
                    Value="{DynamicResource TextBoxTemplate}" />

            <Style.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="DateTime">
                    <Setter Property="ContentTemplate" 
                            Value="{DynamicResource DateTimeTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Type}" Value="Lookup">
                    <Setter Property="ContentTemplate" 
                              Value="{DynamicResource ComboBoxTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>
于 2012-12-04T14:12:55.317 に答える