data-binding 相关问题

将两个数据/信息源绑定在一起并使它们保持同步的一般技术。

当项目具有 BrowserAnimationsModule 时,Angular UI 未拾取数据模型更改

我的项目有一个选择程序的页面。它工作得很好,直到我将 BrowserAnimationsModule 添加到我的项目中。 该页面有一个按钮“切换到程序A”。它始终工作正常,没有妈妈...

回答 2 投票 0

Angular:如何使用动态文本进行数据绑定输入

我想动态更改句子中所选单词的样式(使用自定义管道),如下所示: {{ 产品.句子 | italicArray:product.italicsArray }} 这将创建: 嗨...

回答 1 投票 0

如何将 wpf 组合框绑定到枚举类型并将其显示在组合框中作为定义枚举的描述?

公共枚举 IVAC_VT_SHIFT_SPD { [描述(“16.1299991607666”)] 数据16, [描述(“32.130001068115234”)] 数据32, } public enum IVAC_VT_SHIFT_SPD { [Description("16.1299991607666")] DATA16, [Description("32.130001068115234")] DATA32, } <ComboBox Grid.Row="8" Grid.Column="2" Width="194" Height="40" Margin="0,0,3,0" HorizontalAlignment="Right" VerticalContentAlignment="Center" ItemsSource="{Binding Source={StaticResource IVAC_VT_SHIFT_SPD}}" SelectedValue="{Binding VTShiftSPD}" /> <ObjectDataProvider x:Key="IVAC_VT_SHIFT_SPD" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="enm:IVAC_VT_SHIFT_SPD" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> private IVAC_VT_SHIFT_SPD _VTShiftSPD = IVAC_VT_SHIFT_SPD.DATA16; public IVAC_VT_SHIFT_SPD VTShiftSPD { get => _VTShiftSPD; set { _VTShiftSPD = value; OnPropertyChanged(nameof(VTShiftSPD)); } } 我想要的是将枚举类型值绑定到组合框。但是,我希望组合框的内容显示为说明的内容。该选择必须选择为枚举。 有没有不用转换器的方法? 有没有办法只用Xaml来完成它? 我想要一个简单的方法。 我认为您可以非常接近地实现您正在寻找的目标。我确实使用了几个 C# 类来完成它,但这些类将适用于未来的任何枚举,而无需您不断创建其他类或代码来方便在下拉列表中获取描述。 在我的示例中,我能够产生以下结果 public enum IVAC_VT_SHIFT_SPD { [Description("16.1299991607666")] DATA16, [Description("32.130001068115234")] DATA32, } <Window ... xmlns:local="clr-namespace:StackOverflowAnswers.Wpf" ...> <ComboBox x:Name="Combo" ItemsSource="{Binding Source={enums:EnumBindingSource {x:Type enums:IVAC_VT_SHIFT_SPD}}}" DisplayMemberPath="Description" SelectedValuePath="Value" /> 为了促进这一点,我使用了此链接中概述的方法的改编版:https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/。如果您直接遵循这一点,则无需枚举的 ViewModel 即可获得非常相似的结果。然而,我喜欢使用 ViewModel,因为它允许我根据需要调整一些东西,比如添加对图标属性的支持。 在我的示例中,我创建了一个 EnumViewModel 类来容纳组合框中将显示的内容: public class EnumViewModel { public EnumViewModel(Enum value) { Value = value; Description = getDescription(value); } public Enum Value { get; } public string Description { get; } private string getDescription(Enum value) { if (!(value?.GetType().GetField(value?.ToString()) is FieldInfo enumField)) // value is null... return string.Empty; var descriptionAttribute = enumField.GetCustomAttributes(typeof(DescriptionAttribute), false) .OfType<DescriptionAttribute>() .FirstOrDefault(); if (descriptionAttribute is null || string.IsNullOrEmpty(descriptionAttribute.Description)) // description attribute is missing or blank... return value.ToString(); return descriptionAttribute.Description; } } 还有一个 MarkupExtension 允许我直接绑定到它,而不必将其包含在视图模型或后面的代码中。这设置了使用 Source={enums:EnumBindingSource ...} 的能力。 public class EnumBindingSourceExtension : MarkupExtension { private Type _enumType; public Type EnumType { get => this._enumType; set { if (value == this._enumType) return; if (!isEnumType(value)) throw new ArgumentException("Type must be for an Enum."); this._enumType = value; } } private bool isEnumType(Type type) { if (type is null) return false; var enumType = Nullable.GetUnderlyingType(type) ?? type; return enumType.IsEnum; } public EnumBindingSourceExtension() { } public EnumBindingSourceExtension(Type enumType) { this.EnumType = enumType; } public override object ProvideValue(IServiceProvider serviceProvider) { if (this._enumType is null) throw new InvalidOperationException("The EnumType must be specified."); var actualEnumType = Nullable.GetUnderlyingType(this._enumType) ?? this._enumType; var enumValues = Enum.GetValues(actualEnumType) .OfType<Enum>() .Select(x => new EnumViewModel(x)) .ToList(); return enumValues; } } 枚举不应该显示在 UI 中。枚举是整数的简单枚举,其中每个值都有一个关联的名称。 您的场景根本超出了 enum 类型的意图。 如果您想定义一组常量,其中每个常量携带数据,那么您应该定义一个类型(class 或 struct)。这也将为您在视图中呈现数据提供更大的灵活性,而无需转换器和反射的额外开销。您最终会得到更干净、自然/直观的代码。在您的场景中使用 enum 并不优雅,也没有任何好处。 enum 必须具有代表性,属性或表中不存储任何元数据。 如果 enum 本身确实有意义,您甚至可以考虑使用此自定义类型来定义 enum 的属性 - 仅当该类型不是 enum 的扩展(用于携带元数据)时才会出现这种情况数据),因为 enum 值必须能够独立,即在没有元数据的情况下使用。 例如,如果您创建一个枚举 Color,其中包含 Color.Red 等值,并且如果没有实际的红色值,则无法使用这些值,那么 Color.Red 不应该是枚举,而应该是 class 或 struct 能够定义该元数据。 建议的解决方案如下所示: VTShiftSPD.cs // TODO::Implement IEquatable<VTShiftSPD> (don't forget to override GetHashCode) public readonly struct VTShiftSPD : IEquatable<VTShiftSPD> { public const string Data16 = "DATA16"; public const string Data32 = "DATA32"; public VTShiftSPD(string id, double value) { this.Id = id; this.Value = value; } public string Id { get; } public double Value { get; } } 您可以使用和比较它,例如如下(没有任何反映!): static Main() { var vTShiftSPD = new VTShiftSPD(VTShiftSPD.Data16, 16.1299991607666); Evaluate(vTShiftSPD); } private static void Evaluate(VTShiftSPD vTShiftSPD) { switch (vTShiftSPD.Id) { case VTShiftSPD.Data16: break; case VTShiftSPD.Data32: break; default: break; } } 如果从 VTShiftSPD 创建的实例集不是开放集,您甚至可以将它们本身定义为常量: VTShiftSPDs.cs static class VTShiftSPDs { public static readonly VTShiftSPD Spd16 = new VTShiftSPD(VTShiftSPD.Data16, 16.1299991607666); public static readonly VTShiftSPD Spd32 = new VTShiftSPD(VTShiftSPD.Data32, 32.130001068115234); } 并按如下方式使用它: static Main() { Evaluate(VTShiftSPDs.Spd16); } private static void Evaluate(VTShiftSPD vTShiftSPD) { switch (vTShiftSPD.Id) { case VTShiftSPD.Data16: break; case VTShiftSPD.Data32: break; default: break; } } 并优雅(且高效)地使用它来填充数据视图: MainWindow.xaml.cs // The data source for the ComboBox.ItemsSource public ObservableCollection<VTShiftSPD> VTShiftSPDs { get; } = new ObservableCollection<VTShiftSPD> { VTShiftSPDs.Spd16, VTShiftSPDs.Spd32, }; MainWindow.xaml <Window> <StackPanel> <ComboBox x:Name="VTShiftSPDSelector" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType Window}, Path=VTShiftSPDs}" DisplayMemberPath="Value" /> <Stackpanel DataContext="{Binding Elementname=VTShiftSPDSelector, Path=SelectedItem}> <TextBlock x:Name="Id" Text{Binding Id}" /> <!-- Displays e.g. DATA16 --> <TextBlock x:Name="Value" Text{Binding Value}" /> <!-- Displays e.g. 16.1299991607666 --> </StackPanel> </StackPanel> </Window>

回答 2 投票 0

除了使用 [JsonIgnore] 装饰器之外,还有其他方法可以在 JSON 序列化过程中忽略属性吗?

我正在使用 .net Maui MVVM 源生成器来创建属性作为可观察属性。我正在使用 System.Text.Json.Serialization 将类的属性序列化为 JSON。当我使用 [Json...

回答 1 投票 0

WPF 数据网格从网格获取更改的值并在视图模型中捕获它(坚果当前值)

xaml 文件: xaml 文件: <DataGrid x:Name="BrugerDataGrid" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" IsReadOnly="False" SelectionMode="Single" SelectionUnit="FullRow" ItemsSource="{Binding Brugere, Mode=TwoWay}"> <i:Interaction.Triggers> <i:EventTrigger EventName="RowEditEnding"> <i:InvokeCommandAction Command="{Binding RowEditEndingCommand}" CommandParameter="{Binding SelectedItem, ElementName=BrugerDataGrid}" PassEventArgsToCommand="True" /> </i:EventTrigger> </i:Interaction.Triggers> <!-- DataGrid columns --> 视图模型: public ObservableCollection<Bruger> Brugere { get; set; } public ICommand RowEditEndingCommand => new RelayCommand<Object>(OnRowEditEnding); private void OnRowEditEnding(Bruger bruger) { // bruger is autogenerated from entity framework } 我收到的布鲁格是网格中数据更改之前的值。我如何获取更改后的值,以便我可以将更改后的数据存储到我的数据库 我一直在尝试用这种方法添加一个事件, private void OnRowEditEnding(布鲁格·布鲁格,DataGridRowEditEndingEventArgs e) 但这会给我一个错误: 公共 ICommand RowEditEndingCommand => new RelayCommand(OnRowEditEnding); 说: 参数 1:无法从“方法组”转换为“System.Action” 我认为 PassEventArgsToCommand="True" 也许会让我这样做。 RowEditEnding 事件发生在之前提交或取消行编辑。 您应该做的是在您的 Bruger 类中实现 IEditableObject 接口并处理 EndEdit() 方法中的逻辑。 另一个选项是在视图的事件处理程序中显式提交编辑: private bool _handle = true; private void OnRowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (_handle) { _handle = false; BrugerDataGrid.CommitEdit(); var updatedItem = e.Row.Item as Bruger; var viewModel = this.DataContext as YourViewModel; if (updatedItem != null && viewModel != null) viewModel.RowEditEndingCommand.Execute(updatedItem); _handle = true; } } 将事件参数传递给视图模型会破坏 MVVM 设计模式。在视图的代码隐藏中以编程方式调用命令则不然。

回答 1 投票 0

无法弄清楚模型绑定 ASP.NET Core + Razor Pages 中出了什么问题

我试图简单地将所选项目填充到绑定属性 SelectedDataSourceIDs,但我无法弄清楚我做错了什么。 风景: @页 @model ContosoUniversity.Pages.Analysis.

回答 1 投票 0

Xamarin:ViewModel 不更新 UI

我第一次尝试实现 ViewModel 绑定,发现绑定到视图模型中的属性的标签没有更新以反映该值 我希望这是...

回答 1 投票 0

如何从 WPF 中的 ViewModel 启动故事板动画?

我一直在尝试实现菜单更改到另一个菜单之间的转换。我使用 WPF .Net 8 和 Caliburn Micro 进行 MVVM。 所以我在 MainView.xaml 中创建了故事板动画...

回答 1 投票 0

关于C# WinForms数据绑定(使用INotifyPropertyChanged)和数据刷新问题

我是初学者,正在使用C# WinForms开发网络程序。该程序不断尝试从远程服务器读取数据并将其同步显示在我的文本框中。另外...

回答 2 投票 0

Bind:在服务器端 blazor - c# - mudblazor 中未调用分配的方法之后

我正在尝试使用 @bind-Value 和 @bind-Value:after 在绑定发生后调用方法,但我的代码要么出现错误,要么不会调用该方法。 有了这个...

回答 1 投票 0

MAUI BindingContext 设置为 Binding 时不起作用

在我的主页上,我有一个 MainViewModel,其中包含一些属性,其中一个是 EffectsCtrl (另一个视图模型,EffectsControl 类的实例),其中包含与

回答 4 投票 0

数据绑定 TextBlock 在 Avalonia 中运行

我想做这个 从这个视图模型 公共类 MainWindowViewModel :ViewModelBase { 公共 ObservableCollection RunList { 获取;放; } 公共 MainWindowViewModel() ...

回答 1 投票 0

SWT/JFace 的未弃用数据绑定

我最近一直在研究 Eclipse 插件开发,当我尝试使用 Eclipse Bindings 选项卡将 SWT 文本绑定到我的数据模型中的字符串时,它生成的代码是依赖的...

回答 2 投票 0

ListView 网格中的网格

我有一个包含 id、名称和价格的列表视图。每个这样的项目都有一个带有类别的子列表。 所以“对于每个”项目我想显示所有子项目。 它应该是这样的: 但我不知道...

回答 3 投票 0

在代码隐藏中绑定到 DataTable 时,DataGrid 会部分更新

我有一个 WPF 窗口,其中有一个 DataGrid 作为其子窗口之一。 DataGrid 中的列数仅在运行时确定。以下是我的 window.xaml 文件中 DataGrid 的代码: <

回答 1 投票 0

如果文本框发生更改,如何获取事件?

我通过外部 yaml 文件进行了复杂的模型设计,并将视图添加为后面的代码。需要这个结构,因为我正在构建一种配置管理器,用户可以在其中创建视图布局......

回答 1 投票 0

如何在WPF MVVM中显示带有动态列的表格

我有一个对象列表,每个对象都包含用户定义的属性。这些属性的键和值是自由字符串,因此它们在对象之间不一定一致。无论如何,我

回答 1 投票 0

如何将 XSD 转换为 Python 类

我只是想知道是否有一个程序可以将 XSD 文件转换为 Python 类,就像 JAXB 对 Java 所做的那样?

回答 5 投票 0

在 WPF 中绑定数据值

我正在通过数据绑定来绑定文本框的数据。而不是像这样给出最小值和最大值: 我正在通过数据绑定绑定文本框的数据。而不是像这样给出最小值和最大值: <TextBox Height="24" HorizontalAlignment="Right" abc:TextBoxMaskBehaviour.Mask="Decimal" abc:TextBoxMaskBehaviour.MinimumValue="0" abc:TextBoxMaskBehaviour.MaximumValue="200" Margin="0,9,8.5,0" Name="txtCStart" VerticalAlignment="Top" Width="106" MouseWheel="OnMouseWheel"> 我想通过 .xaml.cs 文件给出它。如何做到这一点? 显然(从你的评论来看,你的问题不是很清楚),你想通过C#代码设置abc:TextBoxMaskBehaviour.MinimumValue和MaximumValue: TextBoxMaskBehaviour.SetMinimumValue(txtCStart, 0); TextBoxMaskBehaviour.SetMaximumValue(txtCStart, 200); 一般来说,您可以像这样设置附加属性:AttachedPropertyClass.SetAttachedProperty(Control, Value)。同样,可以使用 AttachedPropertyClass.GetAttachedProperty(Control). 读取该值。 这看起来可能与 Rubenhak TextBoxMask 功能直接相关(因此我发现它想要回答这个确切的问题)。对于任何关注鲁本哈克的人来说,答案是: Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMask( TextBoxControl, Rubenhak.Common.WPF.MaskType.Decimal); 同样适用于: Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMinimumValue() Rubenhak.Common.WPF.TextBoxMaskBehavior.SetMaximumValue()

回答 2 投票 0

OnLongClickListener 和数据绑定 - void 无法转换为布尔值(Android、Java)

如何将长按监听器与数据绑定集成? 它需要一个布尔值返回。 但显然我的方法无法返回值(void) 公共视图 onCreateView(@NonNull LayoutInflater inflat...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.