0

http://msdn.microsoft.com/en-us/magazine/dd882520.aspxからWPFツールキットのカレンダーにソリューションを適合させようとしていますが、ユーザーコントロールのバインディングを機能させるのに問題があります。FindAncestorとElementNameを使用してみましたが、バインディングエラーが発生します。

ツールチップとカレンダーのDataContextに関係があるのではないかと思います。他の誰かがこの問題を抱えていましたか?

<UserControl x:Class="ChickenPing.MealCalendar"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:conv="clr-namespace:ChickenPing.Converters"
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
    xmlns:primitives="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit"
    xmlns:vsm="clr-namespace:System.Windows;assembly=WPFToolkit"
    xmlns:loc="clr-namespace:ChickenPing"
    x:Name="root">
    <wpf:Calendar x:Name="calendar">
        <wpf:Calendar.Resources>
            <conv:IconConverter x:Key="IconConverter"/>
            <conv:MealCalendarConverter x:Key="MealCalendarConverter" />
            <!--LinearGradientBrush x:Key="MealBackgroundFill" StartPoint="0,0"  EndPoint="0,1">
                <GradientStop Color=""
            </LinearGradientBrush-->
        </wpf:Calendar.Resources>
        <wpf:Calendar.CalendarDayButtonStyle>
            <Style TargetType="primitives:CalendarDayButton">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="primitives:CalendarDayButton">
                            <Grid>
                                <!Grid.ToolTip>
                                    <ToolTip>
                                        <ToolTip.DataContext>
                                            <MultiBinding Converter="{StaticResource MealCalendarConverter}">
                                                <Binding Path="PlacementTarget.DataContext" RelativeSource="{x:Static RelativeSource.Self}"/>
                                                <Binding Path="Meals">
                                                    <Binding.RelativeSource>
                                                        <RelativeSource Mode="FindAncestor" AncestorType="{x:Type loc:MealCalendar}" />
                                                    </Binding.RelativeSource>
                                                </Binding>
                                            </MultiBinding>
                                        </ToolTip.DataContext>

エラーは次のとおりです。

System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='MyAssembly.MyControl', AncestorLevel='1''. BindingExpression:Path=ConversionCollection; DataItem=null; target element is 'ToolTip' (Name=''); target property is 'DataContext' (type 'Object')

そして、DependencyPropertyの宣言:

public static readonly DependencyProperty MealsProperty = DependencyProperty.Register("Meals", typeof(Dictionary<DateTime, IEnumerable<PlannedMealGroup>>), typeof(MealCalendar), new UIPropertyMetadata(new Dictionary<DateTime, IEnumerable<PlannedMealGroup>>()));
public Dictionary<DateTime, IEnumerable<PlannedMealGroup>> Meals {
    get { return base.GetValue(MealsProperty) as Dictionary<DateTime, IEnumerable<PlannedMealGroup>>; }
    set { 
        base.SetValue(MealsProperty, value);
    }
}

同じことが起こる別のコントロールがあるので、何かが足りないのではないかと思います。

4

1 に答える 1

0

ConversionCollection は 'MyControl' ユーザー コントロールのプロパティですか? その場合、このプロパティの既定値は null であるため、このユーザー コントロールの DataContext をそれ自体に設定する必要があります。

public MyControl()
{
    DataContext = this;
}

編集: ConversionCollectionProperty 依存関係プロパティの宣言で、名前を「Meals」と宣言していることに気付きましたが、プロパティは実際には ConversionCollection です。依存関係プロパティが期待どおりに動作するには、これらの名前が一致している必要があります。

public static readonly DependencyProperty ConversionCollectionProperty =
    DependencyProperty.Register(
        "ConversionCollection", 
        typeof(Dictionary<DateTime, IEnumerable<PlannedMealGroup>>), 
        typeof(MyControl), 
        new UIPropertyMetadata(new Dictionary<DateTime,
        IEnumerable<PlannedMealGroup>>()));

public Dictionary<DateTime, IEnumerable<PlannedMealGroup>> ConversionCollection 
{
    get 
    { 
        return base.GetValue(ConversionCollectionProperty) as Dictionary<DateTime, IEnumerable<PlannedMealGroup>>; 
    }
    set 
    { 
        base.SetValue(ConversionCollectionProperty, value);
    }
于 2009-10-20T12:29:29.850 に答える