Извините за ужасный заголовок вопроса, я не знаю, как это сформулировать, не стесняйтесь комментировать.
Я работаю над настольным приложением WPF, используя шаблон MVVM. В моей ViewModel у меня есть большое количество текстовых полей, все из которых я хочу отобразить, используя приведенный ниже шаблон (значительно упрощенный):
<StackPanel Orientation="Vertical">
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SomePredicate}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<Label Content="SomeHeader:"/>
<TextBlock Text="{Binding Path=SomeText}" />
</StackPanel>
Дисплей всегда состоит из:
- Предикат для определения, должна ли отображаться StackPanel
- Строка, используемая в качестве текста заголовка. Это может быть установлено в XAML, оно не должно исходить из модели представления
- Привязка к текстовой строке Textblock в ViewModel
Мне бы очень хотелось иметь возможность определить их следующим образом:
<MyHeaderedTextBlockControl Text="{Binding Path=SomeText}"
Header="SomeHeader:"
Predicate="{Binding SomePredicate}"/>
Можно ли это сделать? Я пытался сделать это с помощью UserControl, но понятия не имел, что я делаю.
Для меня важно, чтобы режимы привязки продолжали работать, то есть, если привязка Text
находится в режиме OneWay
или TwoWay
, TextBlock
должно обновляться, когда свойство Text
в ViewModel повышается OnPropertyChanged
.
Мне также не нравится идея сделать это с помощью View и ViewModel для каждого такого текстового свойства, потому что тогда мне нужно создать эти ViewModel и подключить их для обновлений и т. Д. Мне нужно решение, которое я могу реализовать в View, в идеале ViewModel даже не должен знать об этом.