2011-05-04 73 views
1

我一直在玩,并四处寻找如何将一个模型视图绑定到视图,但我似乎无法解决它。 我有一个名为Search的视图,我想将它绑定到SearchModelView。 查看有一个按钮和一个文本框,并期待:WPF视图模型视图绑定需要帮助请

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,40,0,0" Name="comboBox1" VerticalAlignment="Top" Width="174" /> 
    <Label Content="Client:" Height="28" HorizontalAlignment="Left" Margin="0,12,0,0" Name="label1" VerticalAlignment="Top" Width="71" /> 
    <Label Content="Client Reference:" Height="28" HorizontalAlignment="Left" Margin="0,69,0,0" Name="label2" VerticalAlignment="Top" Width="117" /> 
    <TextBox 
     x:Name="clientRefTxt" 
     Text="{Binding Path=ClientRef, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
     Height="23" 
     HorizontalAlignment="Left" 
     Margin="12,103,0,0" 
     VerticalAlignment="Top" 
     Width="174" /> 
    <Button 
     Content="Search Debtors" 
     Height="23" 
     HorizontalAlignment="Left" 
     Margin="12,140,0,0" 
     Name="button1" 
     VerticalAlignment="Top" 
     Width="89" 
     Command="{Binding Path=SearchCommand}"/> 

</Grid> 

而且我希望它绑定到SearchViewModel:

命名空间Master.ViewModel {

public class SearchViewModel:WorkspaceViewModel 
{ 
    RelayCommand _searchCommand; 
    readonly Search _search; 


    #region Search Properties 
    public string ClientRef 
    { 

     get { MessageBox.Show("GET CLIENTREF"); return _search.ClientRef; } 
     set 
     { 
      MessageBox.Show("SET CLIENTREF"); 
      if (value == _search.ClientRef) 
       return; 
      _search.ClientRef = value; 
      base.OnPropertyChanged("ClientRef"); 
     } 
    } 

    #endregion 

    public ICommand SearchCommand 
    { 
     get 
     { 
      MessageBox.Show("SEARCHCOMMAND"); 

      if (_searchCommand == null) 
      { 
       _searchCommand = new RelayCommand(
        param=> this.Search(), 
        param=> this.CanSearch 
        ); 
      } 
      return _searchCommand; 
     } 
    } 

    public void Search() 
    { 
     MessageBox.Show("SEARCHING"); 
    } 

    bool CanSearch 
    { 
     get { return true; } 
    } 
} 

}

我删除了顶部的所有程序集,但假设它们都在那里。另外请注意,SearchViewModel是在一个单独的DLL中,而不是在与视图的EXE。 任何帮助将是伟大的或至少是一个指针的写入方向,我已经阅读了MSDN上的MVVM文章,并没有帮助...我需要一个更好的破坏绑定这些片断。 在此先感谢。 P.S. 更多的细节: SearchViewModel属于Master.ViewModel 搜索查看是和GUI.View 的一部分,我有想法绑定的对象是如何工作的,我不是来确保对如何看法绑定到视图模型

回答

1

您是否查看网格?我只使用UserControl或Window类型作为视图,但使用网格可能会取得成功。

无论如何,这是使用UserControl视图实例化ViewModel的最简单方法。如果您使用网格,只需用网格标签替换UserControl标签即可。

<UserControl ...(blah blah) 
    xmlns:viewmodel="clr-namespace:Master.ViewModel"> 
    <UserControl.DataContext> 
     <viewmodel:SearchViewModel/> 
    </UserControl.DataContext> 

我相信,保持了查看代码的必要,除非是MVVM的首选模式 - 让XAML线东西你可能的情况下。

1

您需要将视图的DataContext设置为视图模型的实例。有各种各样的这样做的方法,包括那丝它自动的框架,但上手最简单的方法是做它在视图的构造函数:

partial class Search : Window 
{ 
    public Search() 
    { 
    InitializeComponent();    // provided by Visual Studio 

    DataContext = new SearchViewModel(); // all-important! 
    } 
} 

显然,你可能需要提供其他信息来初始化SearchViewModel,但希望这足以让您走上正确的轨道。

0

您将需要像@itowlson建议的那样引导您的应用程序。

但是,如果你有多个ViewModel,你应该允许WPF为你做。这样做的基本方法(在开始有十几个视图之前很容易维护)是创建一个DataTemplate,以将View与ModelView(大多数人称为ViewModel)联系起来。

所以,你所提供的XAML可能是一个用户控件(至少应该是),所以你需要做几件事情

首先创建一个资源字典
(快速方法是右键单击您的项目,然后点击Add -> Resource Dictionary

在该文件中(让我们将其命名为Resources.xaml)把这个:

<DataTemplate DataType="{x:Type vm:SearchViewModel}"> 
    <vw:SearchView> 
</DataTemplate> 

以上是假设你把命名空间vwvm用于查看和视图模型分别命名空间

转到您的App.xaml,并把这个:

<Application.Resources> 
    <ResourceDictionary Source="Resources.xaml"/> 
</Application.Resources> 

上面会告诉WPF,每当遇到SearchViewModel类型的对象:

  • 实例化一个SearchView对象
  • 将它的DataContext设置为SearchViewModel对象

HTH