我想调用视图中的控件,如viewmodel中的按钮和项模板。请告诉我该怎么做。我的观点包含以下内容
<ItemsControl Name="cDetails"
Width="395"
ItemTemplate="{DynamicResource Test}"
ItemsSource="{Binding ViewModels}"
Visibility="{Binding IsLoaded,
Converter={StaticResource visibilityConverter}}">
<Button Name="btnComplete"
Grid.Column="1"
HorizontalAlignment="Center"
Command="{Binding AuditCommand}"
CommandParameter="1">
Complete
</Button>
请告诉我如何使用vb.net在我的viewmodel中调用这些项目。
由于
答案 0 :(得分:2)
从viewmodel中访问视图组件不是在MVVM中执行操作的方法。因为它不是专门设计用于这种方式的,所以你必须尽力使它工作。您可能应该调查如何正确使用MVVM实现目标,或者放弃使用MVVM并在代码隐藏中完成工作。
由于您尚未描述您的目标,因此很难提供具体的建议。通常,在使用MVVM时,您可以操纵viewmodel中的内容并设置属性。您的视图绑定到这些属性,以便在设置时适当更新。您的viewmodel不直接操作视图本身,只是它们绑定的viewmodel属性。
例如,我们假设您要更新TextBlock
上的文字。你可以在xaml中做这样的事情:
<TextBlock Text="{Binding SomeText}" />
然后,您的viewmodel(应该implement the INotifyPropertyChanged interface)定义此属性并根据需要进行设置。
public string SomeText
{
get { return _someText; }
set
{
if (_someText != value)
{
_someText = value;
NotifyPropertyChanged("SomeText");
}
}
}
private string _someText;
...
// At any time, you can set the property, and the
// binding will update the text in the control for you.
SomeText = "Some text";
如果你绝对需要从代码中操作你的视图(或者你没有使用MVVM),那么这类代码的适当位置是&#34; xaml.cs&#34;文件旁边的文件(代码隐藏)。您可以使用<TextBlock x:Name="SomeTextBlock" />
等语法为xaml中的任何内容指定名称,然后从代码隐藏中将其作为具有相同名称的成员变量进行访问。例如,您可以执行SomeTextBlock.Text = "Some text"
。但是,如果您使用的是MVVM,则绝大多数用例通常不需要这样做。
答案 1 :(得分:0)
您不应该尝试直接从ViewModel访问控件。 ViewModel必须不了解View实现。
相反,在WPF中,我们通过Bindings连接View和ViewModel。绑定使用ViewModel中的Properties连接View中控件的属性。
命令是一种特殊类型的属性,可以绑定为Button等控件的操作。
在您的示例中,您需要在ViewModel中包含这些属性:
ViewModels
IsLoaded
AuditCommand
通过管理这些属性,您应该能够控制视图中显示的内容及其行为。
如果您需要更多控制权,请为其他媒体资源创建更多Binding,或在ViewModel中创建一些事件,并从View的代码隐藏中管理它们。