2014-12-06 109 views
0

一个新手绑定问题。我有多个用户控件在我mainview.xaml叫,如:如何将用户控件的属性绑定到MainViewModel并将其datacontext绑定到它自己的viewmodel?

<i:InkRichTextView RichText ="{Binding LastNote}" ... /> 

其中富文本是在InkRichTextView.xaml用户控件的代码隐藏依赖属性和LastNote是mainviewmodel的属性。

的MainViewModel通过在App.xaml中一个DataTemplate的方式与含蓄的MainView相关,如:

<DataTemplate DataType="{x:Type vm:MainViewModel}"> 
     <v:MainView/> 
</DataTemplate> 

我想设置的用户控件InkRichTextView自身的视图模型,它的属性是在MainViewModel举行,是这样的:

<i:InkRichTextView RichText ="{Binding LastNote}" DataContext="{Binding ucFirstControl}" ... /> 

但是当我这样做,我的用户控制InkRichTextView失去了LastNote上下文(或失去在它的依赖属性访问代码隐藏,或两者?) 。

如何维护对LastNote的MainViewModel属性的绑定,并仍为用户控件提供单独的DataContext? (请记住,UserControl在其代码隐藏中定义了依赖项属性)。

感谢您的任何帮助。

+0

啊哈,一个星期,另一人试图创建一个视图模型为他们的用户控件。想知道为什么你会遇到困难吗?这是因为*你不应该这样做*。想想看 - TextBox有一个ViewModel吗?不会。它暴露了你绑定* * ViewModel的属性。这就是你的UserControl应该做的。在这里看到更多的细节:http://stackoverflow.com/search?tab=newest&q=user%3a1228%20is%3aanswer%20usercontrol – Will 2014-12-08 15:34:45

回答

1

通过x:Name属性为MainView指定一个名称。然后,对于RichText属性,您可以使用如下绑定:RichText = {Binding ElementName = mainViewName,Path = DataContext.LastNote}

真的,您可以使用任何在ElementName属性中具有MainViewModel作为其DataContext的控件的绑定。这可能更容易,因为通过名称生成DataTemplate的控件可能会非常棘手。注意如何绑定到ChildName的TextBox基于其DataContext隐式地执行,而TextBox旁边的TextBox通过parentControl(使用ElementName)绑定到DataContext的Name属性。

XAML:

<Window x:Class="WpfApplication3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="250"> 
    <StackPanel x:Name="parentControl" Orientation="Vertical" DataContext="{Binding}"> 
     <TextBox Text="{Binding Name}"/> 
     <StackPanel DataContext="{Binding ChildViewModel}" Margin="10"> 
      <TextBox Text="{Binding ChildName}"/> 
      <TextBox Text="{Binding ElementName=parentControl, Path=DataContext.Name}"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 

CS:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new MainViewModel(); 
    } 

} 

public class PropertyNotifier : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propname) 
    { 
     var propChanged = PropertyChanged; 
     if (propChanged != null) 
      propChanged(this, new PropertyChangedEventArgs(propname)); 
    } 
} 

public class MainViewModel : PropertyNotifier 
{ 
    private string _name = "MainViewModelProperty"; 
    private ChildViewModel _childViewModel = new ChildViewModel(); 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public ChildViewModel ChildViewModel 
    { 
     get { return _childViewModel; } 
     set 
     { 
      _childViewModel = value; 
      OnPropertyChanged("ChildViewModel"); 
     } 
    } 
} 

public class ChildViewModel : PropertyNotifier 
{ 
    private string _childName = "ChildViewModelProperty"; 

    public string ChildName 
    { 
     get { return _childName; } 
     set 
     { 
      _childName = value; 
      OnPropertyChanged("ChildName"); 
     } 
    } 
} 
+0

没有工作。显示屏是空白的。请注意,如果我关闭“DataContext = ...”,那么效果很好,但我无法为usercontrol使用不同的viewmodel。我坚持继承? – 2014-12-06 11:56:44

+0

这种方法应该是可行的 - 但细节取决于对象之间的确切关系。你能发布一个更完整的样本来重现问题吗?我希望能给出一个更完整的答案, – Andrew 2014-12-06 21:45:02

+0

请参阅我的错误 – Andrew 2014-12-06 21:57:13

相关问题