2015-08-17 67 views
0

我有一個具有UserControl的MainWindow。當從ParentControl設置爲UserControl時,綁定不起作用

MainWindow綁定到ViewModel,它是DataContext。

現在使用MainWindowViewModel,我想綁定UserControl中的某些控件。

UserControl對每個我想要綁定的元素都有一個DependencyProperty。

從MainWindow我將UserControl的DependencyProperties綁定到MainWindowViewModel,但綁定不起作用。

主窗口XAML:

用戶控件XAML:

<ComboBox Grid.Column="0" Grid.Row="0" x:Name="ComboBoxVersions" SelectedIndex="0" Margin="10" ItemsSource="{Binding EnvironmentVersions}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="Version " /> 
        <TextBlock Text="{Binding}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

用戶控件代碼背後:

public partial class MultiSelectEnvironmentContextControl 
{   
    public MultiSelectEnvironmentContextControl() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public IEnumerable<string> EnvironmentVersions 
    { 
     get { return (IEnumerable<string>)GetValue(EnvironmentVersionsProperty); } 
     set { SetValue(EnvironmentVersionsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for EnvironmentVersions. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty EnvironmentVersionsProperty = 
     DependencyProperty.Register("EnvironmentVersions", typeof(IEnumerable<string>), typeof(MultiSelectEnvironmentContextControl), new PropertyMetadata(default(IEnumerable<string>))); 


} 

主窗口視圖模型:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Windows; 
using Geico.Applications.Business.CoverageTestHarness.DomainLayer; 

namespace Geico.Applications.Business.CoverageTestHarness.UIWPF.ViewModels 
{ 
    class TestRunnerControlViewModel: ViewModelBase 
    { 

     private DomainFacade domainFacade; 


     /// <summary> 
     /// Initializes a new instance of the <see cref="TestRunnerControlViewModel"/> class. 
     /// </summary> 
     public TestRunnerControlViewModel() 
     { 
      domainFacade = ((App) Application.Current).DomainFacade; 
     } 

     /// <summary> 
     /// Gets the environment versions. 
     /// </summary> 
     /// <value> 
     /// The environment versions. 
     /// </value> 
     public IEnumerable<string> EnvironmentVersions 
     { 
      get 
      { 
       return domainFacade.GetEnvironmentVersions(); 
      } 
     } 
    } 
} 
+0

在輸出什麼綁定錯誤? – netaholic

+0

@netaholic我在輸出窗口中看不到任何錯誤。只是這些數據不是來自綁定後的數據。 – Charu

+0

您的ViewModel類是私有的。讓它公開 – netaholic

回答

0

您的錯誤是在usercontrol構造函數中設置datacontect。 只是刪除

this.DataContext = this; 

public void MultiSelectEnvironmentContextControl() 
{ 
    ... 
} 

這裏是我的代碼: MainWindow.xaml

<Window x:Class="WpfApplication8.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" xmlns:userControls="clr-namespace:WpfApplication8"> 
<Grid > 
    <userControls:UserControl1 EnvironmentVersions="{Binding EnvironmentVersions}" x:Name="MultiSelectEnvironmentContextControl" Margin="10" /> 

</Grid> 

MainWindow.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication8 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      this.DataContext = new TestRunnerControlViewModel(); 
      InitializeComponent(); 

     } 
    } 
} 

UserControl.cs

using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes; 

    namespace WpfApplication8 
    { 
    /// <summary> 
    /// Interaction logic for UserControl1.xaml 
    /// </summary> 
    public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 
    public IEnumerable<string> EnvironmentVersions 
    { 
     get { return (IEnumerable<string>)GetValue(EnvironmentVersionsProperty); } 
     set { SetValue(EnvironmentVersionsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for EnvironmentVersions. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty EnvironmentVersionsProperty = 
     DependencyProperty.Register("EnvironmentVersions", typeof(IEnumerable<string>), typeof(UserControl1), new PropertyMetadata(default(IEnumerable<string>))); 
    } 
} 

vm.cs

using System; 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 
    using System.Linq; 
    using System.Windows; 

    namespace WpfApplication8 
    { 
    class TestRunnerControlViewModel 
    { 
     // private DomainFacade domainFacade; 
     public TestRunnerControlViewModel() 
     { 
      //domainFacade = ((App)Application.Current).DomainFacade; 
     } 

     public IEnumerable<string> EnvironmentVersions 
     { 
      get 
      { 
       return new List<string>() { "test", "test2" }; 
      } 
     } 
    } 
    } 
+0

嗯,我設置DataContext在用戶控件中,因爲我想把控件綁定到依賴屬性,如果我們不這樣做,我認爲它是工作的,因爲父窗口是MainWindow的DataContext從UserControl訪問,而不是正確的方式來使其工作。 – Charu

+0

「我認爲它正在工作,因爲從UserControl訪問的是MainWindow的父級的DataContext」正是如此。你爲什麼反對呢?它的預期行爲 – netaholic

+0

如果要將usercontrols的屬性綁定到另一個控件屬性,則應該在綁定中指定sourceelement – netaholic

相關問題