عرض DataTemplate الافتراضية في ContentControl عندما محتواه فارغ أو فارغة؟

StackOverflow https://stackoverflow.com/questions/1217254

سؤال

وأعتقد أن هذا ممكن، ولكن طريقة واضحة لا يعمل.

وحاليا، أنا أفعل هذا:

<ContentControl
    Content="{Binding HurfView.EditedPart}">
    <ContentControl.Resources>
        <Style
            TargetType="ContentControl"
            x:Key="emptytemplate">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}"
                    Value="{x:Null}">
                    <Setter
                        Property="ContentControl.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Stretch">
                                    <TextBlock>EMPTY!</TextBlock>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Resources>
</ContentControl>

وأنا لا تحصل على أي أخطاء ملزمة وهذا يجمع. ومع ذلك، فإنه لا ينتج النتيجة المتوقعة. لقد حاولت ايضا ما هو واضح:

<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>

وهذا لن ترجمة. ومحاولة تحديد مضمون مرتين فشل أيضا:

<ContentControl
    Content="{Binding HurfView.EditedPart}">
        <TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>

هل يمكنني القيام بذلك دون كتابة محدد قالب مخصص؟

هل كانت مفيدة؟

المحلول

وبسيط، لديك لربط خاصية المحتوى في الاسلوب. سوف أساليب لا الكتابة قيمة على عنصر تحكم إذا كان هناك هدية ملزمة، حتى إذا كانت قيمة بتقييم لاغية. جرب هذا.

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Content" Value="{Binding HurfView.EditedPart}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}">
                    <Setter Property="ContentControl.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                    <TextBlock>EMPTY!</TextBlock>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

نصائح أخرى

ومنذ أن عثر عليها في هذا السؤال، وكان نفس المشكلة اليوم، أردت أن تساهم بطريقة أخرى كيف تحل هذه المشكلة. وبما أنني لم ترغب في إضافة الزناد نمط آخر واستخدمت TargetNullValue الممتلكات التي يبدو أن قليلا أكثر قابلية للقراءة من حل مقبول (الذي يعمل مع ذلك):

    <ContentControl>
      <ContentControl.Content>
        <Binding Path="ContentViewModel">
          <Binding.TargetNullValue>
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
              <TextBlock>EMPTY!</TextBlock>
            </Grid>
          </Binding.TargetNullValue>
        </Binding>
      </ContentControl.Content>
    </ContentControl>

هل يمكن إرجاع DBNull.Value كما FallbackValue من ملزم لمضمون ContentControl، وإنشاء DataTemplate لDBNULL:

<DataTemplate DataType="{x:Type system:DBNull}">
    <!-- The default template -->
</DataTemplate>

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top