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”用户控件上的属性吗?如果是这样,您需要将此用户控件的 DataContext 设置为自身,因为此属性的默认值为 null。

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 回答