天道酬勤,学无止境

将 DataTemplate 的 datacontext 属性绑定到用户控件依赖属性(Binding DataTemplate's datacontext property to a usercontrol dependency property)

问题

在 UWP 应用程序中,我有一个带有数据模板的 Listview。 ListView 通过 ItemsSource 绑定到我的模型的 ObservableCollection。

<ListView SelectionMode="None"
              ItemTemplate="{StaticResource MydataTemplate}"
              ItemsSource="{Binding Meals, Mode=OneWay}"

Meals 是模型 Meal 的 ObservableCollection :

public class Meal
{
    public string restaurantId { get; set; }
    public double price { get; set; }
    public int Quantity { get; set; } = 0;
}

在 ListView DataTemplate 中,我有一个用户控件(ListView 的每个元素都有这个用户控件)。 我想将当前的膳食数量(数量属性)绑定到用户控件的依赖属性:

<DataTemplate x:Key="mydataTemplate">
    ...
    <ccontrol:MyUC Value="{Binding Quantity, Mode=TwoWay}" Grid.Column="2" />
    ...
</DataTemplate>

使用用户控制 DP :

public sealed partial class MyUC : UserControl
{
    public MyUC()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }

    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

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

但是在运行时我有一个绑定表达式错误:

错误:BindingExpression 路径错误:在“Project.MyUC”上找不到“Quantity”属性

它在 UserControl 上搜索,但我想在 DataTemplate 数据上下文中搜索 Quantity 属性。

我红了这篇对我帮助不大的帖子。

提前致谢,

问候

回答1

不要像在MyUC构造函数中那样显式设置 UserControl 的DataContext 。 这样做可以防止从 UserControl 的父控件继承 DataContext。

public MyUC()
{
    this.InitializeComponent();
    // this.DataContext = this; // remove this line
}

像绑定

<ccontrol:MyUC Value="{Binding Quantity}" />

当前(继承的)DataContext 中需要一个属性Quantity ,这里是 ListView 的ItemsSource集合中的当前元素。 当您明确设置DataContext时,这将不起作用。

在 UserControl 的 XAML 中,编写一个 Bindings,以便通过指定 Binding 的ElementName属性将 UserControl 作为其源:

<UserControl ... x:Name="self">
   ...
   <TextBlock Text="{Binding Value, ElementName=self}" />
   ...
</UserControl>
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何正确绑定到MVVM框架中用户控件的依赖项属性(How to correctly bind to a dependency property of a usercontrol in a MVVM framework)
    问题 我一直无法找到一个干净,简单的示例,说明如何正确地使用MVVM框架中具有DependencyProperty WPF实现用户控件。 每当我为usercontrol分配DataContext时,下面的代码都会失败。 我在尝试着: 从调用ItemsControl设置DependencyProperty ,然后使该DependencyProperty的值可用于被调用的usercontrol的ViewModel。 我还有很多东西要学习,并衷心感谢您的帮助。 这是最顶层用户控件中的ItemsControl ,它使用DependencyProperty TextInControl调用InkStringView用户控件(来自另一个问题的示例)。 <ItemsControl ItemsSource="{Binding Strings}" x:Name="self" > <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate>
  • 具有MVVM和依赖项属性的WPF用户控件地狱(WPF User Control hell with MVVM and Dependency Properties)
    问题 这就是我想要做的: 我正在编写一个我想被其他开发人员使用的UserControl 。 我希望最终用户能够使用依赖项属性来使用我的控件。 <lib:ControlView ControlsText={Binding Path=UsersOwnViewModelText} /> 我正在使用MVVM模式。 我正在使用<DataTemplates>将我的ViewModel绑定到他们的View <DataTemplate DataType="{x:Type local:ControlViewModel}"> <local:ControlView /> </DataTemplate> 所以我有两个问题: 我是否在考虑,如果在XAML中使用了UserControl,则当控件的Loaded事件触发时(而不是使用<DataTemplate>方法),UserControl必须将ViewModel设置为其DataContext ? 如何允许用户将数据绑定到控件的依赖项属性,同时仍然将数据绑定到ViewModel? 回答1 首先,如果您正在开发将由其他用户使用的UserControl,我认为MVVM不是一个不错的选择。 一个无表情的控件是您真正应该开发的。 耶利米·莫里尔(Jeremiah Morrill)对此主题发表了一篇博客文章。 话虽如此,如果您具有默认的公共构造函数
  • 如何在UWP中找到相对源模式的祖先(或等效祖先)(How to do relativesource mode find ancestor (or equivalent) in UWP)
    问题 我正在尝试做一些人们认为应该非常简单的事情(至少在WPF中是如此)。 我有一个带有列表框和数据模板的页面,现在该数据模板调用其中带有按钮的用户控件。 没什么好看的,但是按钮命令不是listboxsource的一部分,我找不到一种简单的方法来告诉按钮在哪里寻找命令。 这是场景 <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1"> <Page.Resources> <DataTemplate x:Key="MyDataTemplate"> <local:MyButton /> </DataTemplate> </Page.Resources> <ListBox ItemTemplate="{StaticResource MyDataTemplate}" ItemsSource="{Binding Customers}" /> </Page> <UserControl x:Class="App1.MyButton" xmlns="http://schemas.microsoft.com
  • WPF 用户控件不是数据绑定(WPF User Control Not Data Binding)
    问题 在我的用户控件中,我有一个不是数据绑定的依赖属性。 我查看了几个堆栈溢出帖子,但我无法弄清楚我做错了什么。 永远不会调用属性更改方法。 到目前为止我的代码: 我的用户控件基本上是一个增强的组合框。 DP 位于用户控件内部。 我在数据网格内使用此用户控件。 用户控件的数据上下文是这样设置的。 DataContext={Binding RelativeSource={RelativeSource Self}} #region ProfileType DP public static FrameworkPropertyMetadata ProfileTypeMetaData = new FrameworkPropertyMetadata(ProfileTypes.Default, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, new PropertyChangedCallback(ProfileType_PropertyChanged), new CoerceValueCallback(ProfileType_CoerceValue), false, UpdateSourceTrigger.PropertyChanged)
  • 如何在 TabControl.ContentTemplate 中添加新的用户控件?(How to add new user control in TabControl.ContentTemplate?)
    问题 我对在TabControl.ContentTemplate添加用户控件的新实例有点TabControl.ContentTemplate ? 我的 Xaml 在这里: <TabControl ItemsSource="{Binding Tables}"> <TabControl.ItemTemplate> <DataTemplate> </DataTemplate> </TabControl.ItemTemplate> <TabControl.ContentTemplate> <DataTemplate DataType="{x:Type uc:mytest1}"> <uc:mytest1> </uc:mytest1> </DataTemplate> </TabControl.ContentTemplate> </TabControl> 我将TabControl.ItemsSource属性绑定到ObservableCollection并且在内容模板中我添加了一个用户控件,但是当这个应用程序运行时,我将新项目作为TabItem s 但内容页面持有相同的用户控件,但我想要新用户要为每个新TabItem添加的控件。 我对 WPF 很陌生,可能是我犯了一个非常基本的错误,请指导我。 回答1 ControlTemplate确定不属于单个选项卡项的选项卡控件元素的外观。
  • 从视图模型绑定到 Silverlight 中子用户控件的视图模型? 2 个来源 - 1 个目标(Binding from View-Model to View-Model of a child User Control in Silverlight? 2 sources - 1 target)
    问题 所以我的一个视图有一个 UserControl,里面有另一个“子”UserControl。 外部“父” UserControl 在其 View-Model 上有一个 Collection ,在其上有一个 Grid 控件以显示Items列表。 我想在这个 UserControl 中放置另一个 UserControl 来显示一个表单,表示一个Item的详细信息。 父用户控件的视图模型已经有一个属性来保存当前选定的Item ,我想将它绑定到子用户控件上的 DependancyProperty。 然后我想将该 DependancyProperty 绑定到子 UserControl 的 View-Model 上的一个属性。 然后我可以使用绑定表达式在 XAML 中设置一次 DependancyProperty,并让子 UserControl 像它应该的那样在它的 View-Model 中完成它的所有工作。 我的代码看起来像这样.. 父用户控件: <UserControl x:Class="ItemsListView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" DataContext="
  • 从DataTemplate访问父DataContext(Access parent DataContext from DataTemplate)
    问题 我有一个ListBox绑定到ViewModel上的子集合。 列表框项是根据父ViewModel上的属性在数据模板中设置样式的: <Style x:Key="curveSpeedNonConstantParameterCell"> <Style.Triggers> <DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, ElementName=someParentElementWithReferenceToRootDataContext}" Value="True"> <Setter Property="Control.Visibility" Value="Hidden"></Setter> </DataTrigger> </Style.Triggers> </Style> 我收到以下输出错误: System.Windows.Data Error: 39 : BindingExpression path error: 'CurveSpeedMustBeSpecified' property not found on 'object' ''BindingListCollectionView' (HashCode=20467555)'. BindingExpression:Path
  • 在Silverlight的列表框中访问父数据上下文(Access parent datacontext in listbox in Silverlight)
    问题 在Silverlight 2中,我使用了一个用户控件,该控件继承了其嵌入页面的数据上下文。 该数据上下文包含问题文本,问题类型和答案集合。 在用户控件中是一个列表框,该列表框绑定到答案集合。 如下所示: <ListBox DataContext="{Binding}" x:Name="AnswerListBox" ItemContainerStyle="{StaticResource QuestionStyle}" Grid.Row="1" Width="Auto" Grid.Column="2" ItemsSource="{Binding Path=AnswerList}" BorderBrush="{x:Null}" /> 此列表框具有关联的样式,以单选按钮或复选框的形式显示答案(我想根据问题类型将其隐藏或显示)为: <Style TargetType="ListBoxItem" x:Key="QuestionStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <StackPanel Background="Transparent" > <RadioButton Visibility="{Binding Path
  • 与ContentTemplate中的Bindings和DataContext混淆(Confusion with Bindings & DataContext in ContentTemplate)
    问题 考虑以下样式: <Window.Resources> <Style x:Key="NumberButton" TargetType="Button"> <Setter Property="Width" Value="Auto"/> <Setter Property="Height" Value="Auto"/> <Setter Property="Margin" Value="2"/> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Label Content="{Binding}" FontSize="20" FontFamily="Consolas"/> </DataTemplate> </Setter.Value> </Setter> <EventSetter Event="Click" Handler="OnClicked"/> </Style> </Window.Resources> 我的目标是能够创建多个按钮,每个按钮代表一个0-9数字。 例如,这是数字0的按钮: <Button Grid.Row="3" Grid.Column="1" Style="{StaticResource NumberButton}" Content="0"/>
  • 如何在用户控件和父窗口之间绑定WPF命令(How do I Bind WPF Commands between a UserControl and a parent Window)
    问题 我首先让图片说话。 如此看来,我想创建一个WPF用户控件,该控件支持绑定到父窗口的DataContext。 用户控件只是一个按钮和一个带有自定义ItemTemplate的列表框,用于使用标签和一个删除按钮来呈现内容。 “添加”按钮应在主视图模型上调用ICommand,以与用户进行交互以选择新事物(IThing的实例)。 用户控件中ListBoxItem中的Remove按钮应类似地在主视图模型上调用ICommand,以请求将相关事物移除。 为此,“删除”按钮将必须向视图模型发送一些有关请求删除的事物的标识信息。 因此,有两种类型的命令应可绑定到此控件。 诸如AddThingCommand()和RemoveThingCommand(IThing something)之类的东西。 我可以使用Click事件来使用该功能,但这感觉很hacky,在XAML后面产生了一堆代码,并且与其余原始MVVM实现产生了冲突。 我真的很想正常使用Commands和MVVM。 有足够的代码来使基本的演示工作,我推迟发布整本书,以减少混乱。 正在运行的使我感到与自己如此接近的是,ListBox的DataTemplate正确地绑定了Label,并且当父窗口将项目添加到集合时,它们就会显示出来。 <Label Content="{Binding Path=DisplayName}" />
  • 依赖属性数据上下文(Dependency Property Datacontext)
    问题 我有一个用户控件,并为它设置了一个 Datacontext。 这个用户控件还包含一个依赖属性。 现在,我只想绑定到这个属性。 我认为问题与错误的数据上下文有关。 我的用户控件(称为 TimePicker)中的依赖项属性如下所示: public TimeSpan Time { get { return (TimeSpan)GetValue(TimeProperty); } set { SetValue(TimeProperty, value); OnPropertyChanged(); } } public static readonly DependencyProperty TimeProperty = DependencyProperty.Register("Time", typeof (TimeSpan), typeof (TimePicker)); 我尝试像这样使用它: <upDownControlDevelopement:TimePicker Grid.Row="1" Time="{Binding Path=TimeValue}" /> 当我这样做时,我收到以下绑定错误: System.Windows.Data Error: 40 : BindingExpression path error: 'TimeValue' property not found on
  • WPF:如何通过 XAML 将整个 Control 作为 CommandParameter 传递?(WPF: How to pass whole Control as CommandParameter via XAML?)
    问题 我正在使用 MVVM 并且自定义 ICommand 对象由 ViewModel 层提供。 同时一个 ViewModel 对象可以通过 DataContext 属性附加到多个 View 对象(窗口、页面等)。 在 ICommand.CanExecute() 中,我想检查 View 中某些控件是否存在验证错误(附加到 ViewModel 道具,对于特定的 VM 命令很重要)。 一个 ViewModel 可以提供许多命令,每个命令都有自己的一组用于错误验证验证的控件。 因此,伪 XAML 是: <Button.CommandParameter> <x:Array Type="sys_win:DependencyObject"> <sys_win:DependencyObject> <reference_to_textbox_or_other_control/> </sys_win:DependencyObject> <sys_win:DependencyObject> <reference_to_textbox_or_other_control/> </sys_win:DependencyObject> </x:Array> </Button.CommandParameter> 第二个问题是特定命令可能会被控件调用,控件本身是用于集合项的 DataTemplate 的一部分
  • 如何在列表框 WP8 内绑定数据用户控件(How to bind data user control inside listbox WP8)
    问题 我有一个用户控件。 它有一个TextBlock 。 我想在其中绑定文本 <UserControl x:Class="PhoneApp1.MyUserControl" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <StackPanel Width="200" Height="200" Background="Red"> <TextBlock Text="{Binding Text}" /> </StackPanel> </UserControl> 在MyUserControls.xaml.cs public partial class MyUserControl : UserControl { public MyUserControl() { InitializeComponent(); } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(MyUserControl), new PropertyMetadata(null)); public string Text { get { return (string
  • WPF绑定到列表框selectedItem(WPF binding to Listbox selectedItem)
    问题 任何人都可以在以下方面提供帮助-一直在玩这个游戏,但我一生都无法使它正常工作。 我有一个包含以下属性的视图模型; public ObservableCollection<Rule> Rules { get; set; } public Rule SelectedRule { get; set; } 在我的XAML中,我得到了; <ListBox x:Name="lbRules" ItemsSource="{Binding Path=Rules}" SelectedItem="{Binding Path=SelectedRule, Mode=TwoWay}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="Name:" /> <TextBox x:Name="ruleName"> <TextBox.Text> <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" /> </TextBox.Text> </TextBox> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> 现在,ItemsSource可以正常工作
  • WPF中如何实现标签页控件的惰性绑定?(How to Achieve Lazy Binding of Tab Page Controls in WPF?)
    问题 我有一个实体类。 这个实体有很多属性,实体的数据在TabControl几个TabItems中显示给用户。 我还实现了 MVVM 方法。 当屏幕首先显示给用户时,我只想绑定活动标签页控件,当用户浏览标签页时,将根据需要产生额外的单独绑定。 我怎样才能做到这一点? 回答1 您无事可做,这是默认行为。 在选择此TabItem之前,不会实例化TabItem内容的DataTemplate 编辑:这是一个例子: <Window.Resources> <DataTemplate DataType="{x:Type vm:Page1ViewModel}"> <v:Page1View /> </DataTemplate> <DataTemplate DataType="{x:Type vm:Page3ViewModel}"> <v:Page3View /> </DataTemplate> <DataTemplate DataType="{x:Type vm:Page3ViewModel}"> <v:Page3View /> </DataTemplate> </Window.Resources> ... <TabControl ItemsSource="{Binding Pages}" DisplayMemberPath="Title"> </TabControl> 在上面的代码中,
  • 绑定到 DataTemplate 中的视图模型属性(Binding to a viewmodel property in a DataTemplate)
    问题 我对 XAML 相当陌生,但很喜欢学习它。 我真正挣扎的事情是将属性绑定到DataTemplate的元素。 我创建了一个简单的 WPF 示例来(希望)解释我的问题。 在这个例子中,我试图将DataTemplate CheckBox的Visibility属性绑定到我的视图模型中的一个属性。 (使用这个场景纯粹是为了学习/演示。) 我有一个名为Item的简单 DataModel ,但与本示例无关。 class Item : INotifyPropertyChanged { // Fields... private bool _IsRequired; private string _ItemName; 还有一个相当简单的视图模型,名为 ItemViewModel。 class ItemViewModel : INotifyPropertyChanged { private ObservableCollection<Item> _Items; private bool _IsCheckBoxChecked; private bool _IsCheckBoxVisible; public ObservableCollection<Item> Items { get { return _Items; } set { _Items = value; } } public bool
  • XAML GridView ItemTemplate不绑定到控件(XAML GridView ItemTemplate not binding to control)
    问题 我有一个GridView带有一个包含自定义控件的ItemTemplate: <GridView ItemsSource="{Binding Ubicaciones.Ubicaciones}"> <GridView.ItemTemplate> <DataTemplate> <ctr:HabitacionControl Width="70" Height="140" Ubicacion="{Binding}"/> </DataTemplate> </GridView.ItemTemplate> </GridView> 这是我的自定义用户控件: <UserControl x:Class="MySln.Mucama.Controls.HabitacionControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MySln.Mucama.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas
  • 与ItemsControl的双向绑定(TwoWay Binding With ItemsControl)
    问题 我正在尝试编写一个具有ItemsControl的用户控件,该控件的ItemsTemplate包含一个允许TwoWay绑定的TextBox。 但是,我肯定在我的代码中的某个地方犯了一个错误,因为绑定似乎仅在Mode = OneWay的情况下起作用。 这是我的项目的相当简化的摘录,但仍然包含问题: <UserControl x:Class="ItemsControlTest.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="300"> <Grid> <StackPanel> <ItemsControl ItemsSource="{Binding Path=.}" x:Name="myItemsControl"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBox Text="{Binding Mode=TwoWay, UpdateSourceTrigger=LostFocus, Path=.}" /> </DataTemplate> </ItemsControl
  • 在 XAML 绑定表达式中使用变量(Using a variable in XAML binding expression)
    问题 我正在构建一个可以编辑 POCO 的控件。 POCO 中需要编辑的字段有一个描述符集合,我将ListBox的ItemsSource绑定到该集合。 除其他外,描述符使我能够选择合适的DataTemplate和 POCO 中此ListBox项应编辑的变量名称。 我的 ListBox 是这样构建的: <ListBox ItemsSource="{Binding ColumnCollection, ElementName=root}"> <ListBox.Resources> <DataTemplate x:Key="TextTemplate"> <StackPanel> <TextBlock Text="{Binding DisplayName}" /> <!-- !!! Question about following line !!! --> <TextBox Text="{Binding ElementName=vm.CurentEditing, Path=PathName}" /> </StackPanel> </DataTemplate> <!-- Details omitted for brevity --> <DataTemplate x:Key="PickListTemplate" /> <DataTemplate x:Key="BooleanTemplate" /
  • 如何以编程方式绑定 DataTemplate 内控件的(依赖项)属性?(How to programmatically bind a (dependency) property of a control that's inside a DataTemplate?)
    问题 TextBlock驻留在DataTemplate ,因此我不能通过它的名称来引用它。 那么我如何以编程方式绑定它的(例如) Text属性? XAML: <UserControl x:Class="MyNameSpace.MyCustomControl" ... > ... <ListBox ItemsSource="{Binding Path=ItemsSource}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> ... </UserControl> 代码: public partial class MyCustomControl : UserControl { ... public static readonly DependencyProperty DataSourceProperty = DependencyProperty.Register("DataSource", typeof (IEnumerable), typeof (MyCustomControl), new PropertyMetadata