【问题标题】:WPF user control's datacontext to property in codebehindWPF 用户控件数据上下文到后面代码中的属性
【发布时间】:2012-09-07 13:31:29
【问题描述】:

拥有一个简单的 XAML 用户控件,我想将 DataContext 设置为代码隐藏 (xaml.cs) 文件。

我想在 XAML 中设置 DataContext 和 Itemssource,以便我可以使用属性 ListOfCars 填充组合框

XAML

<UserControl x:Class="Sample.Controls.MyControl"
             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" 
             d:DesignHeight="85" d:DesignWidth="200">
    <Grid Height="85" Width="200" Background="{StaticResource MainContentBackgroundBrush}">
        <StackPanel Orientation="Vertical">                
            <ComboBox Height="23.338" x:Name="CarList" />                
        </StackPanel>    
    </Grid>
</UserControl>

后面的代码

public List<Cars> ListOfCars
{
  get { return _store.ListCars(); }
}

换句话说,我如何在 XAML 中设置绑定,而不是在代码隐藏中执行此操作

public MyControl()
{
  InitializeComponent();
  _store = new Store();
  CarList.ItemsSource = _store.ListCars();
  CarList.DisplayMemberPath = "Name";
}

【问题讨论】:

    标签: wpf


    【解决方案1】:

    只需绑定ItemsSource

    <ComboBox ItemsSource="{Binding ListOfCars}"/>
    

    然后对于 UserControl:

    <MyControl DataContext="{Binding *viewModel*}"/>
    

    您必须在使用 UserControl 的地方而不是在定义中绑定 DataContext,因为在定义中您不知道要绑定什么。 Combobox 自动位于控件的上下文中,因此您可以绑定到 DataContext 而无需任何额外工作。

    绑定到资源的示例:

    <Application.Resources>
      ...
      <viewmodels:ViewModelLocator x:Key="ViewModelLocator"/>
      ...
    </Application.Resources>
    
    
    <MyControl DataContext="{Binding Source={StaticResource ViewModelLocator}}"/>
    

    这会创建 ViewModelLocator 的实例,然后将控件的 DataContext 绑定到该资源。

    【讨论】:

    • 不太了解 {Binding viewModel}。它不起作用,但是如何将 viewModel 绑定到后面的代码,而不以某种方式将其连接起来。没有此 xaml 的特定视图模型
    • 你必须在某个地方定义你的视图模型。这可以是您使用控件的DataContext(然后像这样绑定{Binding}),也可以是静态资源(然后像这样绑定{Binding Source={StaticResource *resource name*}},但您必须定义要绑定到某处的内容.
    • 通读本文了解绑定到视图模型的一些基础知识:msdn.microsoft.com/en-us/library/hh821028.aspx
    • 谢谢,.. 我知道我应该阅读此内容,因为目前我的绑定知识非常有限 :)
    • 但是我真的没有为此使用 MVVM 模式,.. 或者至少我不理解。就像在 xaml 中而不是在后面的代码中进行绑定(请参阅问题更新)
    【解决方案2】:

    Do not do that,你会搞乱到DataContext 的所有外部绑定。请改用UserControl.NameElementName 绑定(或RelativeSource)。

    【讨论】:

    • 我不认为他打算这样做。似乎他只是对如何设置绑定感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2016-10-03
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2015-11-07
    • 2012-12-16
    相关资源
    最近更新 更多