gpt4 book ai didi

wpf - 具有依赖属性的 UserControl 以替换重复的类似控件集

转载 作者:行者123 更新时间:2023-12-03 10:30:21 25 4
gpt4 key购买 nike

对不起,糟糕的问题标题,我不知道如何表达这个,请随时发表评论。

我正在使用 MVVM 模式开发 WPF 桌面应用程序。我的 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 中设置,它不必来自 View 模型
  • 绑定(bind)到 ViewModel 上的 Textblock 文本字符串

  • 我真的很想能够像这样定义这些:
    <MyHeaderedTextBlockControl Text="{Binding Path=SomeText}"
    Header="SomeHeader:"
    Predicate="{Binding SomePredicate}"/>

    这可以做到吗?我尝试用 UserControl 来做,但不知道我在做什么。

    对我来说重要的是绑定(bind)模式仍然有效,即如果 Text绑定(bind)在 OneWayTwoWay模式, TextBlock应该在 Text 时更新ViewModel 上的属性引发 OnPropertyChanged .

    我也不喜欢为每个这样的文本属性使用 View 和 ViewModel 执行此操作的想法,因为我必须创建这些 ViewModel 并将它们连接起来以进行更新等。我想要一个可以在 View 中实现的解决方案,理想情况下ViewModel 甚至不应该知道它。

    最佳答案

    使用 UserControls,您可以在代码中定义依赖属性并通过绑定(bind)将它们转发到"template",例如:

    <UserControl x:Class="Test.UserControls.HeaderedTextBlock"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Name="control">
    <StackPanel Orientation="Vertical">
    <StackPanel.Style>
    <Style TargetType="{x:Type StackPanel}">
    <Style.Triggers>
    <DataTrigger Binding="{Binding Predicate, ElementName=control}" Value="False">
    <Setter Property="Visibility" Value="Collapsed" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </StackPanel.Style>
    <Label Content="{Binding Header, ElementName=control}" />
    <TextBlock Text="{Binding Text, ElementName=control}" />
    </StackPanel>
    </UserControl>

    namespace Test.UserControls
    {
    public partial class HeaderedTextBlock : UserControl
    {

    public static readonly DependencyProperty HeaderProperty =
    DependencyProperty.Register("Header", typeof(string), typeof(HeaderedTextBlock), new UIPropertyMetadata(null));
    public string Header
    {
    get { return (string)GetValue(HeaderProperty); }
    set { SetValue(HeaderProperty, value); }
    }

    public static readonly DependencyProperty PredicateProperty =
    DependencyProperty.Register("Predicate", typeof(bool), typeof(HeaderedTextBlock), new UIPropertyMetadata(false));
    public bool Predicate
    {
    get { return (bool)GetValue(PredicateProperty); }
    set { SetValue(PredicateProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof(string), typeof(HeaderedTextBlock), new UIPropertyMetadata(null));
    public string Text
    {
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
    }

    public HeaderedTextBlock()
    {
    InitializeComponent();
    }
    }
    }

    像这样的东西对你有用吗?

    关于wpf - 具有依赖属性的 UserControl 以替换重复的类似控件集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6842994/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com