gpt4 book ai didi

WPF用户控件: can I bind properties from an internal and an external datacontext?

转载 作者:行者123 更新时间:2023-12-03 10:14:07 27 4
gpt4 key购买 nike

我正在尝试在 WPF/XAML 中构建自己的日历控件,既可以作为练习,也可以用于业余项目。该日历将是一个网格,其中每个单元格显然代表所选月份中的一天。每个单元格都应该能够显示项目列表。日历的输入应该是月份的标识和天的列表。那些“天”将是自定义类型,例如

public class CalendarDay
{
public int DayNumber {get; set;}
public List<DayItem> Items {get; set;}
}

在哪里 DayItem可以代表约会或待办事项之类的东西。

我将其作为用户控件来实现。此日历的 XAML 是 ControlTemplate包含 UniformGrid 1x7 的日期名称(数据绑定(bind)到集合 7 个字符串)和 UniformGrid 6x7 天(数据绑定(bind)到 CalendarDay 的集合)。

包含此日历的 View (用户控件)在概念上如下所示:
<UserControl name="myView" ... xmlns:cal="clr-namespace:the calendar namespace">

<Grid>
<cal:Calendar Days="{Binding DaysWithItems}" CurrentMonth="{Binding DisplayMonth}" />
</Grid>

</UserControl>

在我应用 MVVM 时, myView将有一个 DataContext 设置为某个具有属性 DaysWithItems 的 View 模型类( CalenderDay 实例列表)和属性 DisplayMonth .

理想情况下,此日历控件的使用者应该只需要提供上述两个输入。此外, DaysWithItems应该,来自 myView的观点(双关语是巧合),是 28、29、30 或 31 个元素的列表,具体取决于月份。这意味着该列表应该以某种方式填充到 42 个项目。我认为这应该是日历控件的责任,而不是 myView的 View 模型。

请注意,我也没有提供日期名称。这也应该是日历控件的责任。这不应该明确提供。

这是我的问题。如果,在日历的控件模板中,我想绑定(bind)到日期名称的字符串集合和 CalendarDay 的 42 元素集合,数据上下文应该是 Calendar类本身(因为我之前解释过的职责)。
另一方面,在 myView ,我将日历绑定(bind)到 myViewDaysWithItems (包含 28..31 个元素的(逻辑)集合),所以日历的数据上下文应该是 myView的 View 模型。

我可以使用某种内部数据上下文(= 控件模板的“内部”)以及某种外部数据上下文(= 日历控件使用者提供的数据上下文)吗?

最佳答案

绑定(bind)到 DataContext 以外的其他内容的最简单方法是使用 ElementName

您可以执行以下操作:

UserControl.xaml.cs 的示例:

public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}



public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(UserControl1), new PropertyMetadata(0));


}

用户控件.Xaml
<UserControl x:Class="GridSplitterTest.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" x:Name="MyControl"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Button Content="{Binding ElementName=MyControl, Path=MyProperty}"></Button>
</Grid>
</UserControl>

通过使用 ElementName 并指向 UserControl,您可以绕过 DataContext 并能够绑定(bind)到 UC 内的属性。

关于WPF用户控件: can I bind properties from an internal and an external datacontext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27938921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com