Цель состоит в том, чтобы поменять элемент управления во время выполнения на основе свойства в моей 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, а текст кнопки является пустым (я думаю, что привязка не сработала)
Я считаю, что это потому, что стиль является статическим ресурсом, поэтому привязки SomeText
и ButtonText
в стиле на самом деле не являются привязками в ViewModel, но я не уверен, как передать ссылку на другие свойства в стиле. Или даже если это вещь. Я довольно новичок в XAML, поэтому не уверен, как справиться с этим