我一直在四处寻找如何将模型视图绑定到视图,但我似乎无法解决这个问题。 我有一个名为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
答案 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名称空间放置了名称空间vw
和vm
转到App.xaml
并输入:
<Application.Resources>
<ResourceDictionary Source="Resources.xaml"/>
</Application.Resources>
上面将告诉WPF每当遇到SearchViewModel
类型的对象时:
SearchView
对象SearchViewModel
对象HTH