gpt4 book ai didi

c# - 创建一个自定义模板作为 ResourceDictionary 并从代码隐藏中访问它

转载 作者:行者123 更新时间:2023-11-30 22:08:34 25 4
gpt4 key购买 nike

我需要创建一个简单的 CRUD,并且我想在不同的页面中重用相同的"template"。

MyCrud.xaml(模板)

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<!-- disegno la mia crud-->
<DataTemplate x:Key="MyCrud">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,20,0,20">
<TextBlock Text="Code" FontWeight="Bold" Width="150" FontSize="24"/>
<TextBox x:Name="edtCode" InputScope="Number" Width="300" Margin="20,0,20,0" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,20,0,20">
<TextBlock Text="Vin" FontWeight="Bold" Width="150" FontSize="24"/>
<TextBox x:Name="edtVin" Width="300" Margin="20,0,20,0" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,20,0,20">
<TextBlock Text="Url" FontWeight="Bold" Width="150" FontSize="24"/>
<TextBox x:Name="edtUrl" Width="300" Margin="20,0,20,0" HorizontalAlignment="Left"/>
</StackPanel>
</StackPanel>
</DataTemplate>

然后我在我的App.xaml中注册了它

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="View/MyCrud.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

所以现在我想把它放在一个页面中,并在我的 SearchPage.xaml 中使用它

搜索页面.xaml

<Page ...bla bla bla>
<ContentControl x:Name="MyTemplate" Content="{Binding}" ContentTemplate="{StaticResource MyCrud}" />
</Page>

目前布局完美无缺

问题是:

  1. 如何访问 TextBox?例如那个叫edtVin 来自 SearchPage 的代码隐藏。
  2. 为什么 TextBox p= GetTemplateChild("edtVin") as TextBox; 总是 null?
  3. 我找到了这个 solution , 这是最好的吗?

谢谢!

最佳答案

"Create a proper ViewModel and use proper DataBinding and all your problems will magically disappear."

DataTemplate 旨在用作“特定数据元素的视觉表示”

不需要“访问”WPF 过程代码中的任何 UI 元素。应使用适当的 DataBinding 对这些元素的任何属性进行任何修改。 ,否则,如果你手动修改UI元素的属性(而不修改相应的底层Data Item),你基本上破坏了UI和Data之间的一致性,DataTemplate内部的UI元素将不再反射(reflect)数据项中的数据。

创建一个简单的类来表示您要在屏幕上显示的数据:

public class MyData
{
public string Code {get;set;}

public string Vin {get;set;}

public string Url {get;set;}
}

然后,为了支持双向 WPF 数据绑定(bind),让你的类 Implement the INotifyPropertyChanged interface .

然后,设置 UI 的 DataContext这些项目的相关实例(或集合):

public MyWindow() //Window's constructor
{
InitializeComponent();

var list = new List<MyData>();

//... populate the list with data here...

DataContext = list;
}

然后在不影响 UI 的情况下简单地操作这些数据项的属性:

var item = list[0]; //for example

item.Code = "My New Code";

这是使用 WPF 的正确方法。

关于c# - 创建一个自定义模板作为 ResourceDictionary 并从代码隐藏中访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22204679/

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