xaml 相关问题

可扩展应用程序标记语言(XAML)是一种基于XML的声明式语言,用于在各种框架中初始化结构化值和对象。当问题是关于具有特定框架的XAML的使用时,还应该提供框架的标签,例如, [wpf](Windows Presentation Foundation),[silverlight],[windows-phone],[windows-store-apps](Windows 8商店应用),[win-universal-app],[xamarin.forms]或[工作流程 - 基础]

弹出窗口的 XAML 模板

我是 C# Maui 的新手,并陷入了一项简单的任务,但我找不到任何如何执行该任务的信息。 我的目标是创建一个 XAML 模板,然后我可以用其他 XAML 内容填充该模板。 我的想法是...

回答 1 投票 0

WinUI3:如何在视图模型中引用控件?

我正在使用 TemplateStudio 来构建我的项目 在视图 > TestPage.xaml 中 我正在使用 TemplateStudio 来构建我的项目 在 视图 > TestPage.xaml <Page x:Class="FluentQQ.Views.TestPage" ...> <Grid> <TextBox x:Name="MessageInput" /> </Grid> </Page> 并在视图> TestPage.xaml.cs using FluentQQ.ViewModels; using Microsoft.UI.Xaml.Controls; namespace FluentQQ.Views; public sealed partial class TestPage : Page { public TestViewModel ViewModel { get; } public TestPage() { ViewModel = App.GetService<TestViewModel>(); InitializeComponent(); } } 然后,我尝试获取TextBox“MessageInput”的内容 因此,在 ViewModels > TestViewModel.cs 中,我使用 MessageInput.Text 但是没用 CS0103 The name 'MessageInput' does not exist in the current context 我知道这个问题可能很简单,但请原谅我只是初学者 如错误消息所示,MessageInput控件不存在于*TestPageViewModel中。对于 MVVM,通常您应该使用绑定从视图中获取数据。 只是为了确保我们在同一页面上,在这种情况下: TestPage.xaml 是 View TestPage.xaml.cs 是 代码隐藏 TestPageViewModel.cs 是 ViewModel 安装 CommunityToolkit.Mvvm nuget 包。如果您使用 MVVM 模式,这将使您的生活更轻松。 在您的 ViewModel 中,TestPageViewModel: // This class needs to be "partial" // for the "CommunityToolkit.Mvvm" source generators. public partial class TestPageViewModel : ObservableObject { // The source generators will create // an UI interactable "SomeText" property for you. [ObservableProperty] private string someText; } 在您的代码隐藏中,TestPage.xaml.cs: public sealed partial class TestPage : Page { public TestViewModel ViewModel { get; } public TestPage() { ViewModel = App.GetService<TestViewModel>(); InitializeComponent(); } } 然后在您看来,TestPage.xaml: <TextBox x:Name="MessageInput" Text="{x:Bind ViewModel.SomeText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 仅此而已。每次您更改 TextBox 中的文本时,SomeText 都会更新。 顺便说一句,您可以直接从代码隐藏访问TextBox。只要确保使用 x:Name 来命名即可。 TestPage.xaml.cs MessageInput.Text = "some text";

回答 1 投票 0

将按钮对象从xaml发送到类(使用MVVM模型)

我想更改该代码以与 MVVM 兼容。 下面的代码带有代码隐藏 我想更改该代码以与 MVVM 兼容。 下面的代码带有代码隐藏 <Button x:Name="sevenBtn" Grid.Row="2" Grid.Column="0" Click="NumberBtn_Click" Content="7" Style="{StaticResource numberButtonsStyle}" /> private void NumberBtn_Click(object sender, RoutedEventArgs e) { int selectedValue = int.Parse((sender as Button).Content.ToString()); } 我使用 CommunityToolkit.Mvvm、Microsoft.Xaml.Behavior.Wpf 有人可以帮助我吗? 谢谢 在 MVVM 中发送对象。 这是一个简单的示例代码: 左侧:如何实现数字按钮。 右侧:如何使用CommunityToolkit.Mvvm的另一个示例代码。 MainWindowViewModel.cs using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; namespace WpfAppTests; public partial class MainWindowViewModel : ObservableObject { [RelayCommand] private void UpdateNumber(string numberString) { if (int.TryParse(numberString, out int number) is true) { Number = number; } } [ObservableProperty] private int number; [ObservableProperty] private string someText = string.Empty; [RelayCommand] private void UpdateText(string text) { SomeText = text; } } MainWindow.xaml <Window x:Class="WpfAppTests.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfAppTests" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="800" Height="450" mc:Ignorable="d"> <Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <!-- Your number button sample code. --> <StackPanel Grid.Column="0"> <Button Command="{Binding UpdateNumberCommand}" CommandParameter="{Binding Content, RelativeSource={RelativeSource Self}}" Content="5" /> <TextBlock Text="{Binding Number}" /> </StackPanel> <!-- Simple sample code of how to use the CommunitToolkit.Mvvm. --> <StackPanel Grid.Column="1"> <TextBox x:Name="InputTextBox" /> <Button Command="{Binding UpdateTextCommand}" CommandParameter="{Binding ElementName=InputTextBox, Path=Text}" Content="Update text" /> <TextBlock Text="{Binding SomeText}" /> </StackPanel> </Grid> </Window>

回答 1 投票 0

WinUI 3 DropDownButton 数据绑定

如何将 DropDownButton 的项目绑定到 ViewModel? 如何将 DropDownButton 的项目绑定到 ViewModel? <DropDownButton Width="100" Grid.Column="2" ToolTipService.ToolTip="Language"> <TextBlock FontSize="14" Text="Select language"/> <DropDownButton.Flyout> <MenuFlyout Placement="BottomEdgeAlignedLeft"> <MenuFlyoutItem Text="English" Tag="enEn" Click="DropdownOptionLanguage_Select" /> </MenuFlyout> </DropDownButton.Flyout> </DropDownButton> 如果我们遵循这里的逻辑,MenuFlyout或DropDownButton.Flyout是项目的容器。但是没有 ItemSource 属性或我可以绑定到枚举的东西。 在这种情况下,您可以在代码隐藏中添加项目: 主页.xaml <DropDownButton Content="Select language"> <DropDownButton.Flyout> <MenuFlyout x:Name="SelectLanguageMenuLayout" /> </DropDownButton.Flyout> </DropDownButton> public enum Languages { English, Spanish, French, German, Italian, } public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); foreach (Languages language in Enum.GetValues<Languages>()) { this.SelectLanguageMenuLayout.Items.Add( new MenuFlyoutItem { Text = language.ToString(), Command = ViewModel.ChangeLanguageCommand, CommandParameter = language, }); } } public MainPageViewModel ViewModel { get; } = new(); } public partial class MainPageViewModel : ObservableObject { [RelayCommand] private void ChangeLanguage(Languages language) { } } 我正在使用 CommunityToolkit.Mvvm NuGet 包进行 MVVM 设计。 更新 这应该更接近您在评论中提到的内容: MenuFlyoutEx.cs public class MenuFlyoutEx : MenuFlyout { public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( nameof(ItemsSource), typeof(IEnumerable), typeof(MenuFlyoutEx), new PropertyMetadata(default, OnItemsSourcePropertyChanged)); public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( nameof(Command), typeof(ICommand), typeof(MenuFlyoutEx), new PropertyMetadata(default)); public IEnumerable ItemsSource { get => (IEnumerable)GetValue(ItemsSourceProperty); set => SetValue(ItemsSourceProperty, value); } public ICommand Command { get => (ICommand)GetValue(CommandProperty); set => SetValue(CommandProperty, value); } private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not MenuFlyoutEx menuFlyoutEx || e.NewValue is not IEnumerable itemsSource) { return; } menuFlyoutEx.Items.Clear(); foreach (object item in itemsSource) { MenuFlyoutItem menuFlyoutItem = new() { Text = item.ToString(), Command = menuFlyoutEx.Command, CommandParameter = item, }; menuFlyoutEx.Items.Add(menuFlyoutItem); } } } MainPageViewModel.cs // This class needs to be "partial" for the CommunityToolkit.Mvvm. public partial class MainPageViewModel : ObservableObject { // The CommunityToolkit.Mvvm will generate a "ChangeLanguageCommand" for you. [RelayCommand] private void ChangeLanguage(Languages language) { // Do your logic here... } // The CommunityToolkit.Mvvm will generate a "LanguageOptions" property for you. [ObservableProperty] private Languages[] _languageOptions = Enum.GetValues<Languages>(); } MainPage.xaml.cs public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } public MainPageViewModel ViewModel { get; } = new(); } 并像这样使用它: <DropDownButton Content="Select language"> <DropDownButton.Flyout> <local:MenuFlyoutEx Command="{x:Bind ViewModel.ChangeLanguageCommand}" ItemsSource="{x:Bind ViewModel.LanguageOptions}" /> </DropDownButton.Flyout> </DropDownButton>

回答 1 投票 0

WPF 切换组合框项目文本颜色 MVVM ReactiveUI

好吧,这绝对是一个新手问题,不幸的是无法找出/找到答案。 本质上是将对象列表绑定到组合框,当对象上的“禁用”属性为...

回答 3 投票 0

折叠/展开分组框

我有以下XAML,其中堆叠了三个组框。这些组框的标题中是复选框。 我想要实现的目标:当我选中/取消选中某个框时,我想要

回答 2 投票 0

更改 FlyoutPage。通过 ViewModel 单击按钮上的详细信息页面

情况 我有基本的 FlyoutPage,其中有一些带有菜单按钮和主页作为详细信息的弹出窗口 情况 我有基本的 FlyoutPage,其中有一些带有菜单按钮和主页作为详细信息的弹出窗口 <FlyoutPage ...> <FlyoutPage.Flyout> <generalModule:MenuFlyout x:Name="flyoutPage" /> </FlyoutPage.Flyout> <FlyoutPage.Detail> <NavigationPage> <x:Arguments> <local:MainPage /> </x:Arguments> </NavigationPage> </FlyoutPage.Detail> </FlyoutPage> FlyoutPage.Flyout中的按钮正在触发命令 <ContentPage ...> <Grid WidthRequest="320" RowDefinitions="Auto,Auto" ColumnDefinitions="*" Margin="5"> <toolkit:Expander Grid.Row="0"> <toolkit:Expander.Header> <Label Text="MyPages" Style="{StaticResource MenuHeadline}"/> </toolkit:Expander.Header> <Grid RowDefinitions="Auto,Auto,Auto,Auto" ColumnDefinitions="*" RowSpacing="1"> <Button Text="Page1" Command="{Binding NavigateToPageCommand}" CommandParameter="Page1" Grid.Row="0" Style="{StaticResource MenuButton}"/> <Button Text="Page2" Command="{Binding NavigateToPageCommand}" CommandParameter="Page2" Grid.Row="1" Style="{StaticResource MenuButton}"/> </Grid> </toolkit:Expander> </Grid> </ContentPage> 该命令正在ViewModel中运行方法: public class ViewModelCommands : ViewModel { public ViewModelCommands() : base() { } public ICommand NavigateToPageCommand { get; private set; } public override void Init() { base.Init(); NavigateToPageCommand = new Command((page) => NavigateToPage((string)page), (page) => true); } } VM中的方法应该以某种方式替换FlyoutPage.Detail 问题 以上所有绑定均按预期工作。问题是我该如何改变FlyoutPage.Detail...上述方法是否可行,还是应该以其他方式完成? VM本身无法了解Model中的Details,因此无法直接更新/替换它。 方法 (4) 可以更新 xaml/代码隐藏中绑定的某些属性,但我不知道如何(或者如果可能的话)绑定到: <FlyoutPage.Detail> <NavigationPage> <x:Arguments> <local:MainPage /> </x:Arguments> </NavigationPage> </FlyoutPage.Detail> 另外,在VM中创建NavigationPage并绑定到它似乎不是一个好主意。 Clicked 方法位于 FlyoutPage.Flyout (2) 中,并且必须以某种方式更新 FlyoutPage (1) 中的 Details,因此看起来不太吸引人。此外,我想尽可能远离代码隐藏。 我想根据 MVVM 进行操作,但欢迎任何可行的解决方案。 总结 我需要在单击按钮时更改FlyoutPage.Detail 最好使用命令并严格遵守 MVVM(如果可能) 我想知道如何在 xaml 或代码隐藏中以某种方式绑定它 也许是代码隐藏的一些直接更改,但这将涉及从第二页更改一个页面的属性 也许有一种方法可以从命令返回正确的页面并替换它 您可以直接在代码后面执行此操作,就像FlyoutPage docs所说的那样。虽然您可以在 ViewModel 中实现 Button Command,但 Flyout.Detail 不可绑定。所以,你无法通过 ViewModel 中的绑定来替换整个页面。 让我们简化 Flyout Menu 页面。这是一个名为 button1 的按钮,用于替换 Detail 页面。 <Grid WidthRequest="320" RowDefinitions="Auto,Auto" ColumnDefinitions="*" Margin="5"> <Grid RowDefinitions="Auto,Auto,Auto,Auto" ColumnDefinitions="*" RowSpacing="1"> <Button x:Name="button1" x:FieldModifier="public" Text="Page1" Grid.Row="0" /> ... </Grid> </Grid> 并且在后面的FlyoutPage代码中,我们订阅button1的Clicked事件来替换Detail, public MyFlyoutPage() { InitializeComponent(); flyoutPage.button1.Clicked += OnButtonClicked; ... } private void OnButtonClicked(object sender, EventArgs e) { var button = (Button)sender; string text = button if(text != null) { if (text == "Page1") { Detail = new NavigationPage(new MainPage()); } else { Detail = new NavigationPage(new NewPage1()); } } } 更多按钮也是如此。

回答 1 投票 0

C#、asm 项目返回 System.AccessViolationException

我正在开发一个项目,该项目结合使用 C# 和汇编语言 (ASM) 来模拟绿色盲(一种色觉缺陷)。 ASM 代码生成一个处理图像数据的 DLL...

回答 2 投票 0

如何检索 .net 8 Maui CollectionView 中的字段并将其传递到另一个页面

下面是我的集合视图的图像,其中包含返回的 CaseName、ReportName、Court 和 Judges 查询。有两个按钮(索引和判断)。当用户点击或单击任一

回答 1 投票 0

C#、asm 项目帮助。 System.AccessViolationException,如何解决这个问题?

我正在开发一个项目,该项目结合使用 C# 和汇编语言 (ASM) 来模拟绿色盲(一种色觉缺陷)。 ASM 代码生成一个处理图像数据的 DLL...

回答 1 投票 0

DockPanel ind ListItem 不拉伸

我有一个 ListView,我想要 ListItems 带有左侧图像,而不是右侧的文本和第二个文本。我尝试过使用 Grid 和 DockPanel 进行不同的思考,但是例如DockPanel 未填充...

回答 1 投票 0

使用 Avalonia 将焦点文本框的背景颜色更改为透明

我尝试在 Avalonia 中将焦点文本框的背景颜色更改为透明。 文本框位于模板化用户控件中,我希望它完全透明,因为它位于边框内......

回答 1 投票 0

是否可以直接在 XAML 中与 Visual Studio REST 客户端服务代码生成器生成的对象进行双向数据绑定?

是否可以或实用将 XAML 中的 2 路数据绑定直接连接到基于 OpenApi 元数据文件的 Visual Studio 生成的 RESTApi。例如,Visual Studio 生成一个 REST 客户端,b...

回答 1 投票 0

DataTrigger 不会更改 iOS 上的矩形背景颜色

我在 XAML 中定义了一个矩形,我想根据数据触发器调整其颜色。我从这样简单的事情开始。 我在 XAML 中定义了一个矩形,我想根据数据触发器调整其颜色。我从这样简单的事情开始。 <Rectangle Grid.Row="0" Grid.Column="0" BackgroundColor="#00FF00"> <Rectangle.Triggers> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="True"> <Setter Property="BackgroundColor" Value="#FF0000" /> </DataTrigger> </Rectangle.Triggers> </Rectangle> 这适用于 Android,但在 iOS 上颜色始终为 #00FF00。 Cancelled 在我的视图模型中是一个可为空的布尔值(bool?)。我已经验证该值确实设置为true。我可以使用其他视图上的 Cancelled 绑定来控制可见性等内容。例如,这按预期工作。 <Label IsVisible="{Binding Cancelled}" Text="Canceled" /> 我尝试使这项工作的最后一次迭代看起来像这样。 <Rectangle Grid.Row="0" Column="0"> <Rectangle.Style> <Style TargetType="Rectangle"> <Style.Triggers> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="{x:Null}"> <Setter Property="BackgroundColor" Value="#0000FF" /> </DataTrigger> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="False"> <Setter Property="BackgroundColor" Value="#00FF00" /> </DataTrigger> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="True"> <Setter Property="BackgroundColor" Value="#FF0000" /> </DataTrigger> </Style.Triggers> </Style> </Rectangle.Style> </Rectangle> 但是,iOS 上的颜色仍然始终是#00FF00。这个问题似乎只影响背景颜色。例如,此触发器按预期工作。 <Rectangle.Triggers> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="True"> <Setter Property="HeightRequest" Value="500" /> </DataTrigger> </Rectangle.Triggers> 我尝试使用 Background 代替 BackgroundColor 但仍然不起作用。 来自 矩形文档 要绘制矩形的内部,请将其 Fill 属性设置为 Brush 派生对象。 所以你可以使用 Fill 属性而不是 BackgroundColor, <Rectangle.Triggers> <DataTrigger TargetType="Rectangle" Binding="{Binding Cancelled}" Value="True"> <Setter Property="Fill" Value="#FF0000" /> </DataTrigger> </Rectangle.Triggers> 如果您有任何疑问,请告诉我。

回答 1 投票 0

如何在MAUI ListView或CollectionView中显示行号?

我有一个带有 ViewModel 的 MAUI 页面,其中包含一个字符串类型的数组。数组字段的名称是 Ingredients。这就是我尝试显示该字段的方式: 我有一个带有 ViewModel 的 MAUI 页面,其中包含一个 string 类型的数组。数组字段的名称是Ingredients。这就是我尝试显示该字段的方式: <CollectionView ItemsSource="{Binding Ingredients}"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout Orientation="Horizontal" Padding="5"> <Label Text="..." FontAttributes="Bold" VerticalOptions="Center"/> <Label Text="{Binding .}" VerticalOptions="Center" Margin="10,0,0,0" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> 但是我如何在第一个标签中显示行索引? 所以输出应该是: 1 Item1 2 Item2 3 item3 常见的方法是使用 ItemToIndexConverter,但是,这有以下缺陷: 对于大型列表效率不高,O(N^2) 您的用例要求索引从 1 开始(通常是 0) 无论如何,为了让您开始,您可以在 XAML 中编写以下内容: <Label FontAttributes="Bold" Text="{MultiBinding {Binding Ingredients, Source={Reference mainPage}}, {Binding .}, Converter={local:IndexToItemConverter}}" VerticalOptions="Center" /> 然后,您可以按如下方式实现 IndexToItemConverter: public class IndexToItemConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) => values[0] is ObservableCollection<string> c && values[1] is string s ? c.IndexOf(s) : -1; public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException(); }

回答 1 投票 0

在后面的代码中设置时,XAML 数据绑定失败

在 WPF 项目中,我有一个名为 RectZone 的 UserControl 开头为 在 WPF 项目中,我有一个名为 RectZone 的 UserControl 开头为 <UserControl x:Class="SublimeTriptych.control.RectZone" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:control="clr-namespace:SublimeTriptych.control" mc:Ignorable="d" AllowDrop="True" xml:lang="fr-FR" Drop="DropRectZone" DragOver="DragOverRectZone" DragEnter="DragEnterRectZone" DragLeave="DragLeaveRectZone" MinHeight="800" MinWidth="400" d:DesignHeight="800" d:DesignWidth="400"> <Grid> <Canvas Background="{Binding ZoneImage, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"/> <Rectangle Stroke="Black" Visibility="{Binding GuideVisibility, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" StrokeThickness="{Binding FrameThickness, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"> <Rectangle.Effect> <DropShadowEffect BlurRadius="100" Color="{Binding DropShadowColor, RelativeSource={RelativeSource AncestorType=control:RectZone}}" /> </Rectangle.Effect> </Rectangle> <StackPanel VerticalAlignment="Bottom" Background="#83808080" Visibility="{Binding TitleVisibility, RelativeSource={RelativeSource AncestorType=control:RectZone}}"> <TextBlock> <Run Text="{Binding ActualWidth, StringFormat=N2, FallbackValue=200, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" FontSize="{Binding StatusFontSize, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"/> <Run Text="X" FontSize="{Binding StatusFontSize, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"/> <Run Text="{Binding ActualHeight, StringFormat=N2, FallbackValue=450, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" FontSize="{Binding StatusFontSize, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"/> </TextBlock> <TextBlock Text="{Binding Status, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" FontSize="{Binding StatusFontSize, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" Visibility="{Binding LogVisibility, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}"/> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Title, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" FontSize="{Binding StatusFontSize, Mode=OneWay, RelativeSource={RelativeSource AncestorType=control:RectZone}}" /> </StackPanel> 在后面的代码中,我定义了属性依赖项: public int FrameThickness { get { return (int)GetValue(FrameThicknessProperty); } set { SetValue(FrameThicknessProperty, value); } } public static readonly DependencyProperty FrameThicknessProperty = DependencyProperty.Register(nameof(FrameThickness), typeof(int), typeof(RectZone), new PropertyMetadata(1)); public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(RectZone), new PropertyMetadata("title")); public ImageBrush? ZoneImage { get { return (ImageBrush)GetValue(ZoneImageProperty); } set { SetValue(ZoneImageProperty, value); } } public static readonly DependencyProperty ZoneImageProperty = DependencyProperty.Register(nameof(ZoneImage), typeof(ImageBrush), typeof(RectZone), new PropertyMetadata(null)); public Visibility LogVisibility { get { return (Visibility)GetValue(LogVisibilityProperty); } set { SetValue(LogVisibilityProperty, value); } } public static readonly DependencyProperty LogVisibilityProperty = DependencyProperty.Register(nameof(LogVisibility), typeof(Visibility), typeof(RectZone), new PropertyMetadata(Visibility.Visible)); 我相信所有这些都是正确的,VS2022设计器显示没有问题,但是,我得到了XAML绑定失败: 其中之一的文字版本: Severity: Error Count: 4 Data Context: Visibility Binding Path: TitleVisibility Target: RectZone.TitleVisibility Target Type: Visibility Description File: TitleVisibility property not found on object of type Visibility 错误消息并未导致问题的根源。 我在另一个用户控件RectZone中使用ProjectVarioView,它在以下代码后面的代码中。 我在 ViewModel 中确定了许多 RectZone,但我在后面的代码中设置了数据绑定: 看来所有错误都与我在SetGrid和AddZone中设置的数据绑定(共7个)有关: private void ViewModelChanged(object? sender, PropertyChangedEventArgs e) { if(e.PropertyName != nameof(ViewModel)) return; SetGrid(GridZonesContainer, ViewModel.CompoConf.Cols, ViewModel.CompoConf.Rows, MarginWidth); } private void SetGrid(Grid gridBase, int cols, int rows, int marginWidth) { cols = cols * 2 + 1; rows = rows * 2 + 1; var star = new GridLength(1, GridUnitType.Star); var margin = new GridLength(marginWidth); var marginBinding = new Binding("MarginWidth") { Source = ViewModel.Margins, Mode = BindingMode.TwoWay }; gridBase.SetBinding(MarginWidthProperty, marginBinding); for (int x = 0; x < cols; x++) gridBase.ColumnDefinitions.Add(new ColumnDefinition { Width = x % 2 != 0 ? star : margin }); for (int y = 0; y < rows; y++) gridBase.RowDefinitions.Add(new RowDefinition { Height = y % 2 != 0 ? star : margin }); for (int x = 1, datax = 0; x < cols; x += 2, datax++) for (int y = 1, datay = 0; y < rows; y += 2, datay++) AddZone(x, y, datax, datay); } private void AddZone(int gridx, int gridy, int datax, int datay) { //ZoneImage = "{Binding ZonesData[gridx, gridy].Image, Mode=TwoWay}" //Title = "{Binding ZonesData[gridx, gridy].Title, Mode=TwoWay}" //TitleVisibility = "{Binding TitleVisibility, UpdateSourceTrigger=PropertyChanged}" //GuideVisibility = "{Binding GuideVisibility}" //LogVisibility = "{Binding LogVisibility}" //DebugMode = "{Binding DebugMode, Mode=TwoWay}" /> var mz = new RectZone(); var imageBinding = new Binding("Image") {Source = ViewModel.ZonesData[datax, datay].LastVignette, Mode = BindingMode.TwoWay}; mz.SetBinding(RectZone.ZoneImageProperty, imageBinding); var titleBinding = new Binding("Title") {Source = ViewModel.ZonesData[datax, datay].Name, Mode = BindingMode.TwoWay }; mz.SetBinding(RectZone.TitleProperty, titleBinding); var titleVisibilityBinding = new Binding("TitleVisibility") { Source = ViewModel.TitleVisibility }; mz.SetBinding(RectZone.TitleVisibilityProperty, titleVisibilityBinding); var guideVisibilityBinding = new Binding("GuideVisibility") { Source = ViewModel.GuideVisibility }; mz.SetBinding(RectZone.GuideVisibilityProperty, guideVisibilityBinding); var logVisibilityBinding = new Binding("LogVisibility") { Source = ViewModel.LogVisibility }; mz.SetBinding(RectZone.LogVisibilityProperty, logVisibilityBinding); var debugModeBinding = new Binding("DebugMode") { Source = ViewModel.DebugMode, Mode = BindingMode.OneWay }; mz.SetBinding(RectZone.DebugModeProperty, debugModeBinding); GridZonesContainer.Children.Add(mz); Grid.SetRow(mz, gridy); Grid.SetColumn(mz, gridx); _ZonesList.Add(mz); } ViewModel 有这个属性,其他 ViewModel 的数组: public ZoneViewModel[,] ZonesData { get => _zonesData; set { if (Equals(value, _zonesData)) return; _zonesData = value; OnPropertyChanged(); } } 和: public Visibility TitleVisibility { get => _titleVisibility; set { if (value == _titleVisibility) return; _titleVisibility = value; OnPropertyChanged(); } } public Visibility GuideVisibility { get => _guideVisibility; set { if (value == _guideVisibility) return; _guideVisibility = value; OnPropertyChanged(); } } public Visibility LogVisibility { get => _logVisibility; set { if (value == _logVisibility) return; _logVisibility = value; OnPropertyChanged(); } } ZoneViewModel 实现了这个接口: public interface IMediaViewModel : INotifyPropertyChanged { public StopwatchBag Sw { get; } public Uri URI { get; } public ImageSize ImageSize { get; set; } public string Name { get; set; } public string Filepath { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } public long SizeBytes { get; set; } public ImageBrush LastVignette { get; set; } public IReadOnlyList<Directory>? Metadata { get; set; } public bool HasMetadata { get; } public bool HasVignettes { get; } public Dictionary<string, string> MetaDic { get; } } 我做错了什么? 问题出在Binding实例创建上;我误用了Path(构造函数中的字符串arg),Source应该是包含属性的ViewModel(在Path中指示)。 例如,在实践中,而不是: var imageBinding = new Binding("Image") {Source = ViewModel.ZonesData[datax, datay].LastVignette, Mode = BindingMode.TwoWay}; var imageBinding = new Binding("LastVignette") {Source = ViewModel.ZonesData[datax, datay], Mode = BindingMode.TwoWay};

回答 1 投票 0

在 WPF 触摸应用程序模态窗口中触摸时按钮卡在悬停状态

我正在开发一个专为触摸屏设计的WPF应用程序。有一个模式窗口,上面有“新建”按钮。该按钮有 3 种状态: 普通的: 悬停(橙色背景): 按下(或者...

回答 1 投票 0

行为绑定在 CommunityToolkit.Maui 中不起作用

我已更新为使用 .NET 9,随后将 CommunityToolkit.Maui 更新为 v10.0,因为它是支持 .NET MAUI 的最新版本,但它似乎破坏了我的应用程序中的行为。

回答 1 投票 0

我可以对弹出页面类本身定义的属性进行数据绑定吗?

我有一个弹出页面,我想从中返回一个值。所以在它的 c# 文件中,我的代码如下所示: 公共部分类 SelectDb : PopupPage { 任务完成源

回答 1 投票 0

在 WPF 中更改组合框的背景颜色而不粘贴整个模板?

我知道你可以右键单击,编辑模板>编辑副本,粘贴整个 ComboBox 模板,然后更改几行,但是真的没有办法在短短几里内更改背景吗...

回答 2 投票 0

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