mvvm 相关问题

Model-View-ViewModel(MVVM)是一种架构设计模式,用于实现用户界面,通过其表示逻辑(其ViewModel)将UI(View)与其数据(Model)分开。

如何使 WPF DataGrid 显示具有绑定和 DataTemplate 的 ViewModel 集合

我只是希望显示 DataGrid 内某种列表的内容。我目前正在尝试使用 ObservableCollection<> 和 DataGrid,但这可能会改变。我如何 DataTem...

回答 2 投票 0

如何从按钮修改 ViewModel 数据?

看来我完全失去了MVVM数据流的概念: 我有一个简单的示例视图,显示 Doc 项目数组,由 ViewModel 类提供,该类必须是单例,可从多个

回答 1 投票 0

C# WPF MVVM 带参数实例化框架

我有一个带有 Window WINDOWCompanies 的 WPF 应用程序。在此窗口中,我有两个 Comobox 绑定到 WINDOWCompaniesVM 中的 ObservableCollections。一旦

回答 1 投票 0

WinUI 3. 使用 MVVM 以编程方式滚动列表视图

我正在尝试使用两个按钮(每个方向一个)和 MvvM 模式以编程方式滚动列表视图的内容。 到目前为止,我能找到的所有其他解决方案都使用了 x:Name 和...

回答 3 投票 0

在按钮命令上,将 UserControl 上的 ItemControl 项传递到 ViewModel

我想是时候寻求帮助了!我有一个列出 UserControls 的 ItemsControl(称为CompoundCardControl): 我想是时候寻求帮助了!我有一个列出 UserControls 的 ItemsControl(称为CompoundCardControl): <ScrollViewer Grid.Row = "1" VerticalScrollBarVisibility="Auto"> <ItemsControl ItemsSource="{Binding Method.Compounds}"> <ItemsControl.ItemTemplate> <DataTemplate> <control:CompoundCardControl/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </ScrollViewer> UserControl 包含一个按钮,用于从 ListView(和 ViewModel)中删除项目: <Grid Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="25"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Margin="5,0,0,0" Text="{Binding Name}" /> <TextBlock Grid.Column="1" Margin="5,0,0,0" Foreground="Gray" FontSize="10" VerticalAlignment="Center" Text="RT"/> <TextBlock Grid.Column="2" Margin="5,0,0,0" Text="{Binding RetentionTime , StringFormat= '\{0\} minutes'}" /> <Button Grid.Column="3" HorizontalAlignment="Right" Style="{StaticResource menuBarButton}" Command="{Binding DataContext.DeleteCompoundCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding Compound}"> <Image Width="12" Height="12" Source="/Resources/Icons/Delete.png"/> </Button> </Grid> 这是我的父窗口的 ViewModel(但它显然不起作用)”: public class MethodDialogViewModel : ViewModelBase { //properties public DialogModeEnum DialogMode { get; private set; } public string WindowTitle { get { return DialogMode == DialogModeEnum.Add ? "New method" : "Edit method"; } } public string ButtonText { get { return DialogMode == DialogModeEnum.Add ? "Add" : "Update"; } } public Method Method { get; set; } public MethodCompound Compound { get; set; } = new MethodCompound(); //constructor public MethodDialogViewModel(Method method, DialogModeEnum dialogMode) { DialogMode = dialogMode; Method = method; } //commands public RelayCommand DeleteCompoundCommand => new(execute => DeleteCompound(Compound)); private void DeleteCompound(MethodCompound methodCompound) { //Logic not implimented. I just want to see if I can get the object "methodCompound" if (methodCompound != null) { MessageBox.Show(methodCompound.ID); } else { MessageBox.Show("Please select a compound.", "Delete compound", MessageBoxButton.OK, MessageBoxImage.Information); } } } 基本上我想将 ItemsControl 中的 Item(实际上是底层对象)传递给 ViewModel。我怎么做?还是我完全搞砸了? 您的代码存在一些奇怪之处,这似乎导致了为什么没有任何内容按预期工作。 RelayCommand 委托似乎是错误的。根据参数名称execute,您似乎得到了错误的委托签名。 RelayCommand实现的原始签名是ICommand.Execute(object commandParameter): void。这意味着 lambda 的 execute 参数应命名为,例如commandParameter。然后您实际上必须将该参数传递给执行委托。否则,Button.CommandParameter值将丢失,即不转发: 公共 RelayCommand 删除复合命令 => new(commandParameter => DeleteCompound((MethodCompound )commandParameter)); MethodDialogViewModel.Compound属性始终返回相同的实例 Grid.Width内CompoundCardControl上的绑定是多余的,因为Grid会自然拉伸以填充可用空间。 因为您想要滚动 ItemsControl 内部的项目,而不是 ItemsControl 本身,所以必须将 ScrollViewer 添加到 ControlTemplate 的 ItemsControl 中,它包裹着 ItemsPresenter。 <ControlTemplate TargetType="ItemsControl"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <ScrollViewer> <ItemsPresenter /> </ScrollViewer> </Border> </ControlTemplate> 请注意,ItemsControl不提供任何性能功能(例如 UI 虚拟化),这可以显着改善较大列表或包含昂贵项目或项目容器的列表的体验。 另一方面,ListBox 是一种高级的 ItemsControl,带有滚动和 具有 UI 虚拟化和一些有用的属性,例如返回当前所选项目的 ListBox.SelectedItem 属性。在您的情况下,您可以将其绑定到 MethodDialogViewModel.Compound 属性。要消除突出显示,您只需覆盖 ListBoxItem.Template: <!-- A ListBoxItem without highlighting. You can add this template to a resource to reuse it. --> <ControlTemplate x:Key="NoHighlightListBoxItemTemplate" TargetType="ListBoxItem"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <ContentPresenter /> </Border> </ControlTemplate> 一些一般性说明:自定义控件(例如 UserControl)永远不应该使用自己的 DataContext。例如,当 DataContext 发生变化时,控件就会损坏。由于 Binding.RelativeSource 的目标元素是自定义控件之外的,因此将自定义控件移动到可视化树中的其他位置也会破坏自定义控件。为了防止这种情况,请添加请求将所需数据传递到自定义控件的依赖属性,例如通过数据绑定。然后将内部控件绑定到这些依赖属性。目前尚不清楚为什么在这种情况下使用 UserControl。您可以通过直接在 UserControl 中定义项目的布局来安全地避免 DataTemplate 的开销。如果需要分隔,您可以将 DataTemplate 移动到其自己的文件中。 这与解决您的问题无关,但如果您关心良好的控制设计,则与此相关。这些是一些基础知识。 CompoundCardControl.xaml.cs public partial class CompoundCardControl : UserControl { public MethodCompound Compound { get => (MethodCompound)GetValue(CompoundProperty); set => SetValue(CompoundProperty, value); } public static readonly DependencyProperty CompoundProperty = DependencyProperty.Register( "Compound", typeof(MethodCompound), typeof(CompoundCardControl), new PropertyMetadata(default)); public ICommand DeleteCommand { get => (ICommand)GetValue(DeleteCommandProperty); set => SetValue(DeleteCommandProperty, value); } public static readonly DependencyProperty DeleteCommandProperty = DependencyProperty.Register( "DeleteCommand", typeof(ICommand), typeof(CompoundCardControl), new PropertyMetadata(default)); public CompoundCardControl() { InitializeComponent(); } } CompoundCardControl.xaml <UserControl x:Name="Root"> <Button Style="{StaticResource menuBarButton}" Command="{Binding ElementName=Root, Path=DeleteCommand}" CommandParameter="{Binding ElementName=Root, Path=Compound}"> <Image Source="/Resources/Icons/Delete.png"/> </Button> </UserControl> MainWindow.xaml <Window> <Window.DataContext> <MethodDialogViewModel /> </Window.DataContext> <Window.Resources> <!-- A ListBoxItem without highlighting --> <ControlTemplate x:Key="NoHighlightListBoxItemTemplate" TargetType="ListBoxItem"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ContentPresenter /> </Border> </ControlTemplate> </Window.Resources> <ListBox ItemsSource={Binding Method.Compounds}"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="Template" Value="{StaticResource NoHighlightListBoxItemTemplate}" /> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate DataType="{x:Type MethodCompound}"> <control:CompoundCardControl Command="{Biding DeleteCompoundCommand}" Compound="{Binding}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Window> MethodDialogViewModel.cs public class MethodDialogViewModel : ViewModelBase { //properties public DialogModeEnum DialogMode { get; private set; } public string WindowTitle { get { return DialogMode == DialogModeEnum.Add ? "New method" : "Edit method"; } } public string ButtonText { get { return DialogMode == DialogModeEnum.Add ? "Add" : "Update"; } } public Method Method { get; set; } // This does never change. Consider to bind it to the ListBox.SelectedItem property public MethodCompound Compound { get; set; } = new MethodCompound(); //constructor public MethodDialogViewModel(Method method, DialogModeEnum dialogMode) { DialogMode = dialogMode; Method = method; } //commands public RelayCommand DeleteCompoundCommand => new(ExecuteDeleteCompoundCommand); private void ExecuteDeleteCompoundCommand(object commandParameter) => DeleteCompound((MethodCompound)commandParameter); private void DeleteCompound(MethodCompound methodCompound) { // methodCompund will never be NULL in the current scenario this.Method.Compunds.Remove(methodCompound); } }

回答 1 投票 0

.Net Maui 社区工具包弹出多个页面

我正在基于 .Net Maui shell 的应用程序中进行登录过程,并认为最好在弹出窗口(社区工具包或 mopup)中执行此操作,但目前有一个未解决的问题使我无法使用 mopup。 ..

回答 1 投票 0

动态添加列表框项目时出现问题

我正在尝试向 ModelB 上的 ListBox 添加一条来自 ModelA 的消息 1.- 每当 ModelA 上发生触发时, A型 公共字符串消息 { 获取=>_消息; 放 {

回答 1 投票 0

maui:在 mvvm 中单击按钮后从视图内部导航到另一个视图

我正在尝试从另一个视图模型打开一个新页面。 我正在这样做: 我的页面已注册: builder.Services.AddSingleton(); 建设者.服务.

回答 1 投票 0

列系列 x 轴不同间隔的不同颜色填充同一个系列?

我正在尝试实现速度/时间绘图 UI,我使用带有 MVVM 模式的 WPF 和 Beto-rodriguez 的实时图表作为我的绘图库。 我正在使用列系列。 我有两个问题: 1)我必须...

回答 4 投票 0

MAUI MVVM ContentView 在项目中的多个位置使用,具有多个视图模型,而不是只有一个

我目前正在开发一个仅针对Windows平台的.NET 8 MAUI,具体来说,目标Windows框架是10.0.19041.0。 这个 .NET 8 MAUI 项目包含在一个更大的 .net 解决方案中...

回答 1 投票 0

WPF - 如何使 ListBox 在 MVVM 中运行“选择时”功能? [Caliburn.Micro]

我正在制作一个统计绘图辅助程序。我是 WPF 的新手。 我已经有 2 个列表框: 简介列表 比赛文件夹列表 首先,我想从第一个中选择(选择)个人资料

回答 1 投票 0

如何确保 MVVM View 绑定到特定方法

我对 MVVM 很陌生,我想知道是否可以确保视图在某个位置包含对特定方法的绑定。例如,使用 MVC,我将拥有一个包含所有内容的 Iview 界面...

回答 1 投票 0

WPF - 如何使 ListBox 在 MVVM 中“选择时”运行函数?

我正在制作一个统计绘图辅助程序。我是 WPF 的新手。 我已经有 2 个列表框: 简介列表 比赛文件夹列表 首先,我想从第一个中选择(选择)个人资料

回答 1 投票 0

.NET Maui Carousel查看新手问题

嗨,如果这个问题有点新手,我很抱歉。但我花了大约 10 个小时试图了解如何做我想做的事。 我已经用 CurrentItem、CurrentPosition 等尝试了很多东西......

回答 1 投票 0

Wpf gridview 选定的项目

我有 ListView 和 GridView 内部的 ListView 视图,并且指定了 ListView 项目源。我似乎没有找到怎么能。我得到 GridView 的 SelectedItem 或 SelectedItem 更改。 我有 ListView,其中 GridView 位于 ListView 的内部视图,并且指定了 ListView 项目源。我似乎没有找到怎么能。我得到 SelectedItem 或 GridView 的 SelectedItem 更改。 <ListView Grid.Row="4" Margin="0,250,0,0" ItemsSource="{Binding TestBinding}" SelectedItem="{Binding Path=selectedItem}" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" SelectionChanged="ListView_SelectionChanged"> <ListView.View> <GridView AllowsColumnReorder="False" > <GridViewColumn Header="Test" DisplayMemberBinding="{Binding Path=Test1}" Width="100" /> <GridViewColumn Header="Test2" DisplayMemberBinding="{Binding Path=Test2}" Width="130" /> </GridView> </ListView.View> </ListView> 这是我的代码,它工作正常: public partial class MainWindow : Window, INotifyPropertyChanged, INotifyPropertyChanging { public class MyObj { public string Test1 { get; set; } public string Test2 { get; set; } } public MainWindow() { InitializeComponent(); TestBinding = new ObservableCollection<MyObj>(); for (int i = 0; i < 5; i++) { TestBinding.Add(new MyObj() { Test1 = "sdasads", Test2 = "sdsasa" }); } DataContext = this; } #region TestBinding private ObservableCollection<MyObj> _testBinding; public ObservableCollection<MyObj> TestBinding { get { return _testBinding; } set { if (_testBinding != value) { NotifyPropertyChanging("TestBinding"); _testBinding = value; NotifyPropertyChanged("TestBinding"); } } } #endregion #region selectedItem private MyObj _selectedItem; public MyObj selectedItem { get { return _selectedItem; } set { if (_selectedItem != value) { NotifyPropertyChanging("selectedItem"); _selectedItem = value; NotifyPropertyChanged("selectedItem"); } } } #endregion #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; // Used to notify the page that a data context property changed protected void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion #region INotifyPropertyChanging Members public event PropertyChangingEventHandler PropertyChanging; // Used to notify the data context that a data context property is about to change protected void NotifyPropertyChanging(string propertyName) { if (PropertyChanging != null) { PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); } } #endregion } 就我个人而言,我避免使用可观察的集合,因为我更喜欢对我的应用程序的功能进行更多控制。所以... 在 XAML 中,确保拼写为 SelectedItem="{Binding Path=SelectedItem}",注意大写 S。 然后,在您的 SelectionChanged 方法中,只需... private void myListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedItem = (yourModel)myListView.SelectedItem; }

回答 2 投票 0

模块中共享 ViewModel

我有一个 Activity,下面有多个片段。我想与共享视图模型共享数据,但它们都位于不同的模块中。我无法获取 ActivityViewModel 类。当我收到

回答 1 投票 0

在android中的模块之间共享ViewModel实例

我正在研究 MVVM 架构。我想在我的 Android 应用程序中的模块之间共享视图模型的实例。当用户从应用程序模块完成骑行时,我想访问我的聊天模块视图...

回答 2 投票 0

如何获取 InputBinding 以在 WPF 列表视图上触发 MouseBinding 命令

这是一个常见问题,我在这里看到了很多问题的提出和回答。可悲的是,所有答案似乎都不适合我。如何让 DoubleClick 命令在 Li 中的 UserControl 上触发...

回答 1 投票 0

为组合框创建用户定义的列表(EF、WPF、MVVM、C#)?

我有一个名为 Project 的对象。该项目有一个名为 ProjectState 的字段。过去这个字段是一个枚举,所以很容易处理。它作为 ItemSource 绑定到 ComboBox,什么都没有

回答 1 投票 0

为组合框(EF、WPF、MVVM、C#)创建用户定义列表的最佳方法?

我有一个名为 Project 的对象。该项目有一个名为 ProjectState 的字段。过去这个字段是一个枚举,所以很容易处理。它作为 ItemSource 绑定到 ComboBox,什么都没有

回答 1 投票 0

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