目标是在运行时基于我的ViewModel中的属性交换控件,并使显示的控件具有绑定来更新ViewModel中的属性。我首先在View.xaml中创建以下样式:
<UserControl.Resources>
<Style x:Key="DisplayTextOrButton" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding TextNotButton}" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Content="{Binding SomeText}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding TextNotButton}" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Button Content="{Binding ButtonText}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
请注意,绑定LabelText
和ButtonText
是ViewModel中属性的绑定。
然后在View.xaml中进一步了解以下内容:
<ContentControl Content="{Binding TextNotButton}"
Style="{StaticResource DisplayTextOrButton}">
</ContentControl>
最后,ViewModel.cs具有以下属性:
private bool textNotButton;
public bool TextNotButton
{
get => this.textNotButton;
set
{
this.textNoButton = value;
this.OnPropertyChanged("TextNotButton");
}
}
private string someText;
public string SomeText
{
get => this.someText;
set
{
this.someText = value;
this.OnPropertyChanged("SomeText");
}
}
private string buttonText;
public string ButtonText
{
get => this.buttonText;
set
{
this.buttonText = value;
this.OnPropertyChanged("ButtonText");
}
}
该样式在标签和按钮之间进行切换时效果很好,但是更改TextBox中的文本不会更新ViewModel中的属性,并且Button的文本为空(我想是因为绑定无效)< / p>
我认为这是因为样式是静态资源,因此样式中的绑定SomeText
和ButtonText
实际上不是ViewModel中的绑定,但是我不确定如何传递将其他属性引用到样式中。甚至就是那件事。我对XAML还是很陌生,所以不确定如何处理