WPF View-ModelView绑定需要帮助请

时间:2011-05-04 04:05:27

标签: c# mvvm binding

我一直在四处寻找如何将模型视图绑定到视图,但我似乎无法解决这个问题。 我有一个名为Search的视图,我想将它绑定到SearchModelView。 View有一个按钮和一个文本框,看起来:

<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中,而不是在带有View的exe中。 任何帮助都很棒或者至少是写入方向的指针,我已经阅读过关于MVVM的msdn文章,并没有帮助......我有点需要一个更好的纲要来绑定那些太多的碎片。 提前致谢。 附: 更多细节: SearchViewModel属于Master.ViewModel SearchView是GUI.View的一部分 我已经知道绑定对象是如何工作的,我不知道如何将视图绑定到viewmodel

3 个答案:

答案 0 :(得分:1)

您需要将视图的DataContext设置为视图模型的实例。有很多方法可以做到这一点,包括自动连接它的框架,但最简单的入门方法是在视图的构造函数中执行它:

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

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

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

答案 1 :(得分:1)

你的视图是网格吗?我只使用UserControl或Window类型作为视图,但您可以使用网格获得成功。

无论如何,这是使用UserControl View实例化ViewModel的最简洁方法。如果您使用网格,只需用Grid标记替换UserControl标记。

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

我认为除非必要,否则不要使用View的代码是MVVM的首选模式 - 让XAML尽可能为您提供服务。

答案 2 :(得分:0)

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

但是如果您有多个ViewModel,则应该允许WPF为您执行此操作。执行此操作的基本方法(在您开始拥有十几个视图之前很容易维护)是创建一个DataTemplate,将View与您的ModelView绑定(大多数人称之为ViewModel)。

所以你提供的xaml可能在UserControl中(至少它应该是)所以你需要做几件事

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

在该文件中(我们将其命名为Resources.xaml)将其放入:

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

以上假设您分别为View和ViewModel名称空间放置了名称空间vwvm

转到App.xaml并输入:

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

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

  • 实例化SearchView对象
  • 将其DataContext设置为SearchViewModel对象

HTH