Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF用户控件:我可以从内部和外部datacontext绑定属性吗?_Wpf_Xaml_Mvvm_Data Binding_Calendar - Fatal编程技术网

WPF用户控件:我可以从内部和外部datacontext绑定属性吗?

WPF用户控件:我可以从内部和外部datacontext绑定属性吗?,wpf,xaml,mvvm,data-binding,calendar,Wpf,Xaml,Mvvm,Data Binding,Calendar,我正在尝试用WPF/XAML构建自己的日历控件,既可以作为练习,也可以用于业余项目。该日历将是一个网格,其中每个单元格显然代表所选月份中的一天。每个单元格都应该能够显示项目列表。日历的输入应该是一个月的标识和一个天数列表。这些日子将是一个自定义类型,类似 public class CalendarDay { public int DayNumber {get; set;} public List<DayItem> Items {get; set;} } 当我应用MV

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

public class CalendarDay
{
    public int DayNumber {get; set;}
    public List<DayItem> Items {get; set;}
}
当我应用MVVM时,myView将有一个DataContext,它被设置为某个视图模型类,该类具有属性DaysWithItems、日历日实例列表和属性DisplayMonth

理想情况下,此日历控件的使用者只需提供上述两个输入。此外,从myView的角度来看,DaysWithItems应该是一个包含28、29、30或31个元素的列表,具体取决于月份。这意味着列表应该以某种方式填充到42项。我认为这应该是日历控件的责任,而不是myView的视图模型

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

这是我的问题。如果在calendar的控件模板中,我希望绑定到日期名称的字符串集合和CalendarDay的42元素集合,那么datacontext应该是calendar类本身,因为我在前面解释了它的职责。 另一方面,在myView中,我将日历绑定到myView的DaysWithItems逻辑集合,该集合包含28..31个元素,因此日历的datacontext应该是myView的视图模型


我是否可以使用某种内部datacontext=控件模板的内部,以及某种外部datacontext=日历控件使用者提供的datacontext?

绑定到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,能够绑定到UC内部的属性。

以下是此类数据绑定的最新进展。如果要从设置为DataContext的对象将数据绑定到属性,请使用普通绑定路径:

您也可以命名控件并使用引用它:

<TextBlock Text="{Binding PropertyOfNamedControl, ElementName=NameOfControl}" />
谢谢我没有想到ElementName。它起作用了。
<TextBlock Text="{Binding PropertyOfDataContextObject}" />
<TextBlock Text="{Binding PropertyOfUserControl, RelativeSource={RelativeSource 
    AncestorType={x:Type YourPrefix:YourUserControl}}}" />
<TextBlock Text="{Binding PropertyOfNamedControl, ElementName=NameOfControl}" />