Wpf 如何实现代码隐藏元素的数据绑定?

Wpf 如何实现代码隐藏元素的数据绑定?,wpf,data-binding,user-controls,custom-controls,Wpf,Data Binding,User Controls,Custom Controls,我有以下场景:我正在创建一个纸牌游戏,作为其中的一部分,我想创建一个UserControl,以使界面编程更简单、更好。我正在创建以下用户控件: .cs 我希望能够做两件事:当使用这个用户控件时,能够通过绑定发送一个嵌合体,并且,能够将所有文本和其他元素绑定到这个嵌合体。我找了很多,但没有找到令我满意的东西 你们觉得怎么样 我已经试着读到: 还有很多其他的页面,但似乎都不够直截了当,通过破解其中的代码,我没有找到问题的解决方案。我可以从你的任务中了解到的任何东西中提出以下建议 您应该将其设置为自

我有以下场景:我正在创建一个纸牌游戏,作为其中的一部分,我想创建一个UserControl,以使界面编程更简单、更好。我正在创建以下用户控件:

.cs

我希望能够做两件事:当使用这个用户控件时,能够通过绑定发送一个嵌合体,并且,能够将所有文本和其他元素绑定到这个嵌合体。我找了很多,但没有找到令我满意的东西

你们觉得怎么样

我已经试着读到:


还有很多其他的页面,但似乎都不够直截了当,通过破解其中的代码,我没有找到问题的解决方案。

我可以从你的任务中了解到的任何东西中提出以下建议

您应该将其设置为自定义控件,而不是UserControl

请查看以下链接以获取帮助-

使Chimera成为支持绑定的DependencyProperty,如您添加的SO链接和上述文章中所述。


我可以从你的任务中了解到的任何东西中建议你做以下事情

您应该将其设置为自定义控件,而不是UserControl

请查看以下链接以获取帮助-

使Chimera成为支持绑定的DependencyProperty,如您添加的SO链接和上述文章中所述。

首先,制作嵌合体a,使其能够参与绑定系统

public static readonly DependencyProperty ChimeraProperty = 
    DependencyProperty.Register("Chimera ", typeof(ChimeraViewModel), 
    typeof(ChimeraUserControl), new FrameworkPropertyMetadata(null));

public ChimeraViewModel Chimera 
{
    get { return (ChimeraViewModel)GetValue(ChimeraProperty ); }
    set { SetValue(ChimeraProperty, value); }
}
其次,您可以通过RelativeSource或ElementName绑定引用您的Chimeria属性

我通常不建议在UserControl中定义UserControl.DataContext,因为该值应该从使用UserControl的任何对象传入。在UserControl内部设置可能会在以后试图找出特定UserControl为什么不能与预期的DataContext一起工作时引起混淆

就我个人而言,当我创建一个应该与特定UserControl一起使用的ViewModel时,我更喜欢在应用程序中设置一个DataTemplate,以便使用自定义UserControl绘制ViewModel的所有实例。这意味着我假设UserControl.DataContext将始终是特定的ViewModel类型

或者要显示单个对象,我通常会使用ContentControl之类的东西

首先,制作嵌合体a,使其能够参与绑定系统

public static readonly DependencyProperty ChimeraProperty = 
    DependencyProperty.Register("Chimera ", typeof(ChimeraViewModel), 
    typeof(ChimeraUserControl), new FrameworkPropertyMetadata(null));

public ChimeraViewModel Chimera 
{
    get { return (ChimeraViewModel)GetValue(ChimeraProperty ); }
    set { SetValue(ChimeraProperty, value); }
}
其次,您可以通过RelativeSource或ElementName绑定引用您的Chimeria属性

我通常不建议在UserControl中定义UserControl.DataContext,因为该值应该从使用UserControl的任何对象传入。在UserControl内部设置可能会在以后试图找出特定UserControl为什么不能与预期的DataContext一起工作时引起混淆

就我个人而言,当我创建一个应该与特定UserControl一起使用的ViewModel时,我更喜欢在应用程序中设置一个DataTemplate,以便使用自定义UserControl绘制ViewModel的所有实例。这意味着我假设UserControl.DataContext将始终是特定的ViewModel类型

或者要显示单个对象,我通常会使用ContentControl之类的东西


从我得到的投票结果来看,我想这是一个真正的问题,即缺少绑定文档。在您尝试执行所需操作的地方添加xaml或代码。它将更精确地显示问题。代码隐藏在这里。稍后我将添加一段XAML,虽然在我看来这不是必需的,因为我在那里什么都做不了。从我得到的投票结果来看,我想这是一个真正的问题,即缺少绑定文档。在您尝试执行所需操作的地方添加XAML或代码。它将更精确地显示问题。代码隐藏在这里。稍后我将添加一块XAML,尽管在我看来这不是必需的,因为我在那里什么都做不了。非常感谢!现在这是直截了当的!问:我定义了DataTemplate而不是UserControl?@Bruno我根据需要使用DataTemplates和UserControl。如果在它自己的控件中对元素进行分组有意义,我将使用UserControl。如果是简单的,或者对于较小的范围,我将使用DataTemplate。另外,将DataTemplate放在有意义的地方。如果它正在定义应用程序范围的模板,请将其放在application.Resources中。如果是用户控件模板,请将其放在UserControl.Resources中。非常感谢!现在这是直截了当的!问:我定义了DataTemplate而不是UserControl?@Bruno我根据需要使用DataTemplates和UserControl。如果在它自己的控件中对元素进行分组有意义,我将使用UserControl。如果是简单的,或者对于较小的范围,我将使用DataTemplate。另外,将DataTemplate放在有意义的地方。如果它正在定义应用程序范围的模板,请将其放在application.Resources中。如果是用户欺诈 trol模板,将其放在UserControl.Resources中。
<UserControl x:Name="ChimeraViewRoot" ... >

    <StackPanel>
        <!-- ElementName Binding -->
        <TextBlock Text="{Binding ElementName=ChimeraViewRoot, Path=Chimeria.Name}" />

        <!-- RelativeSource Binding -->
        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria.Name}" />

    </StackPanel>
</UserControl>
<UserControl x:Name="ChimeraViewRoot" ... >
    <StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria}" >

        <TextBlock Text="{Binding Name}" />
        <TextBlock Text="{Binding Description}" />

    </StackPanel>
</UserControl>
<DataTemplate DataType="{x:Type local:ChimeriaViewModel}">
    <local:ChimeriaView /> <!-- DataContext will always be ChimeriaViewModel -->
</DataTemplate>
<ItemsControl ItemsSource="{Binding MyListOfChimeriaViewModels}" />
<!-- Will get drawn using ChimeriaView due to DataTemplate defined above -->
<ContentControl Content="{Binding MyChimeriaViewModelProperty}" />
<UserControl>
    <StackPanel>
        <!-- I know the DataContext is ChimeriaViewModel -->
        <TextBlock Text="{Binding Name}" />
        <TextBlock Text="{Binding Description}" />

    </StackPanel>
</UserControl>