【问题标题】:Set textBlock text that is inside a datatemplate from C# (XAML)从 C# (XAML) 设置数据模板内的 textBlock 文本
【发布时间】:2023-03-04 16:40:01
【问题描述】:

我开始尝试使用 C# 和 XAML 创建一个现代应用程序。我已经使用过 C#,但我从未接触过 XAML 或 WPF 代码,所以我有一个初学者问题..

我正在使用 MSFT 模板 Hub 应用程序 (XAML),但如果该文本块位于数据模板内,我不知道如何通过 C# 代码在该文本块上设置文本值。

有人可以帮我解决这个问题吗?

我已经用谷歌搜索了它,但我找不到任何具有该答案/解释的网站。

这是一个关于我正在尝试做的例子:

XAML:

<DataTemplate >
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Image Source="Assets/MediumGray.png" Stretch="Fill" Width="420" Height="280"/>
                        <TextBlock Style="{StaticResource SubheaderTextBlockStyle}" Grid.Row="1" Margin="0,10,0,0" TextWrapping="Wrap"  
                                   x:Uid="Section1Subtitle" Text="{Binding Score}"/>
                        <TextBlock x:Name="desc"  Grid.Row="2" Margin="0,10,0,0" 
                                   x:Uid="DescriptionHeader" Text="{Binding Test}"/>
                        <TextBlock x:Name="texttest" Grid.Row="3"
                                   Text="{Binding Name}"/>
                    </Grid>
</DataTemplate>

C#代码:

public class Class1
  {
        string name = "This is a test";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

我在这里做错了什么?

提前致谢,

【问题讨论】:

  • 看来你需要学习MVVM。基于 XAML 的技术适合使用这种模式,它鼓励分离 UI 和数据/应用程序逻辑。

标签: c# wpf xaml


【解决方案1】:

问题解决了。

非常感谢您的帮助。

这是修改后的代码,允许我从 C# 中获取变量:

<DataTemplate>
                    <Grid>
                        <Grid.DataContext>
                            <local:Class1/>
                        </Grid.DataContext>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Image Source="Assets/MediumGray.png" Stretch="Fill" Width="420" Height="280"/>
                        <TextBlock Style="{StaticResource SubheaderTextBlockStyle}" Grid.Row="1" Margin="0,10,0,0" TextWrapping="Wrap"  
                                   x:Uid="Section1Subtitle" Text="{Binding Score}"/>
                        <TextBlock x:Name="desc"  Grid.Row="2" Margin="0,10,0,0" 
                                   x:Uid="DescriptionHeader" Text="{Binding Test}"/>
                        <TextBlock x:Name="texttest" Grid.Row="3"
                                   Text="{Binding Name}"/>
                    </Grid>
                </DataTemplate>

【讨论】:

    【解决方案2】:

    这个还将带您了解 WP 开发的许多方面,包括使用设备、动态磁贴等: http://www.jeffblankenburg.com/2011/10/31/31-days-of-mango/

    虽然有点老了。

    【讨论】:

      【解决方案3】:

      通常没有办法在 C# 代码中轻松地在 DataTemplate 中设置某些内容。但是,通过绑定、转换器和选择器有一些杂乱无章的方法。

      【讨论】:

      • “乱七八糟的方式” - 我看不出&lt;TextBlock Text="{Binding MyText}"/&gt; 有多“乱”
      • 请问有什么例子吗?
      • 我的意思是弄得乱七八糟,这样他就可以通过 c# 直接设置它,比如设置绑定到模板外的东西,然后设置该文本值。
      • @w9jds 所以你认为 UI 和数据的正确分离在某种程度上是“混乱的”。不错...
      • 当您使用 DataTemplate 时,您通常希望创建它,以便为任何使用相同对象的视图构建它。所以你应该做的是将文本绑定到对象中的属性。
      【解决方案4】:

      XAML 提供了一种简单而强大的方法来自动更新 商业模式和用户界面。这种机制称为 数据绑定。每当你的商业模式的数据发生变化时, 它会自动反映用户界面的更新,反之亦然 反之亦然。这是 WPF 中将数据带给用户的首选方法 界面。

      数据绑定可以是单向的(源 -> 目标或目标 目标)。

      试试链接Learn XAML

      【讨论】:

        【解决方案5】:

        抽象地说,DataTemplate某条数据的可视化表示

        DataTemplate 中的 UI 元素应反映此类数据的状态。

        在基于 XAML 的技术中,DataBinding 有助于保持 UI 与数据同步,使用真正干净和美观的声明方式,而不是传统的过程式编程。

        所以,假设你有一段数据,比如:

        public class Person
        {
            public string FirstName {get;set;}
        
            public string LastName {get;set;}
        }
        

        那么您可能有一个代表该数据的 DataTemplate,例如:

        <DataTemplate DataType="local:Person">
           <StackPanel>
              <TextBlock Text="{Binding LastName}"/>
              <TextBlock Text="{Binding FirstName}"/>
           </StackPanel>
        </DataTemplate>
        

        密钥在{Binding} 声明中。

        有关详细信息,请参阅上面链接的 MSDN 文章。

        【讨论】:

        • 感谢 HighCore 的回答。我没有属性 DataType。我不明白为什么我不能做一些应该如此简单的事情......任何使用 Windows 8.1 XAML / C# 模板的例子?
        猜你喜欢
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多