gpt4 book ai didi

c# - ListBox 未正确更改 ContentControl 的 ViewModel

转载 作者:行者123 更新时间:2023-11-30 18:32:47 26 4
gpt4 key购买 nike

我对 WPF 还是很陌生,我决定更改我正在开发的应用程序,开始尽可能地遵循 MVVM 模式。当我尝试让列表框指示内容控件的 View 模型时,我遇到了问题。我已经坚持了一段时间,在互联网上搜索并没有为我提供答案。

出于某种原因,正在生成列表框包含的 View 模型的新实例作为内容控件的数据上下文。当我调试时,我确保列表框包含它应该包含的 View 模型,并且我在列表框中选择的项目确实是列表框正在选择的项目,但是内容控件会根据选择而变化。有一个 View 模型填充内容控件,但它不在列表框填充的集合中。而且我可以通过删除按钮以某种方式删除内容控件中的 View 模型。但是,当我在列表框中进行选择更改,或将新项目添加到集合中时,它会使用一个新的 View 模型填充内容控件,该 View 模型再次不在集合中。我不知道它为什么这样做,或者我的代码中的什么暗示了这种行为。

我做了一个简单的应用程序来尝试找出我做错了什么。它完美地复制了我的问题。我很确定这些按钮不遵守 MVVVM(应该运行 View 模型中包含的命令以遵守我一直在阅读的 MVVM)但这不是我现在主要关心的问题,因为没有按钮。

主窗口.xml

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.MainWindow"
Title="MainWindow" Height="440" Width="436">
<Window.DataContext>
<local:mwvm/>
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type local:ucvm}">
<local:uc/>
</DataTemplate>
</Window.Resources>
<Grid>
<Button Content="a" HorizontalAlignment="Left" Margin="323,351,0,0" VerticalAlignment="Top" Width="95" Click="Button_Click"/>
<Button Content="r" HorizontalAlignment="Left" Margin="323,378,0,0" VerticalAlignment="Top" Width="95" Click="Button_Click_1"/>
<ContentControl Margin="10,10,110,10" Content="{Binding SelectedItem, ElementName=lb_UCs}"/>
<ListBox x:Name="lb_UCs" HorizontalAlignment="Left" Height="336" Margin="323,10,0,0" VerticalAlignment="Top" Width="95" ItemsSource="{Binding UCs}" DisplayMemberPath="CoolText"/>
</Grid>
</Window>

主窗口.xaml.cs

public partial class PanelPartsView : UserControl
{
private PanelPartsViewModel _DC;

public PanelPartsView()
{
InitializeComponent();
_DC = DataContext as PanelPartsViewModel;
}

private void btn_Remove_Click(object sender, RoutedEventArgs e)
{
_DC.Panels.Remove(lb_Panels.SelectedItem as PartsViewModel);
}

private void btn_Add_Click(object sender, RoutedEventArgs e)
{
var pvm = new PartsViewModel();
_DC.Panels.Add(pvm);
lb_Panels.SelectedItem = pvm;
System.Console.WriteLine("lb_Panels.selecteditem = {0}", ((PartsViewModel)lb_Panels.SelectedItem).PanelName);
System.Console.WriteLine("cc_PanelParts.content = {0}", ((PartsViewModel)cc_PanelParts.Content).PanelName);
}
}

mwvm

class mwvm
{
private ObservableCollection<ucvm> _UCs = new ObservableCollection<ucvm>();

public ObservableCollection<ucvm> UCs
{
get { return _UCs; }
}

public mwvm()
{
//this is for for testing, the real application would be purely dynamic
_UCs.Add(new ucvm());
_UCs.Add(new ucvm());
_UCs.Add(new ucvm());
}
}

uc.xaml

<UserControl
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:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.uc"
mc:Ignorable="d" d:DesignWidth="300" Height="90">
<Grid>
<Grid.DataContext>
<local:ucvm/>
</Grid.DataContext>
<Button Content="{Binding CoolText}" Margin="10,10,10,0" Height="44" VerticalAlignment="Top"/>
<TextBox Height="23" Margin="10,59,10,0" TextWrapping="Wrap" Text="{Binding CoolText}" VerticalAlignment="Top"/>
</Grid>
</UserControl>

uc.xaml.cs

public partial class uc : UserControl
{
public uc()
{
InitializeComponent();
}
}

cvm.cs

class ucvm : INotifyPropertyChanged
{
private static int i = 1;

private string _CoolText = "<" + i++ + ">" + System.DateTime.Now.ToLongTimeString();
public string CoolText
{
get { return _CoolText; }
set
{
_CoolText = value;
NPC("CoolText");
}
}

public event PropertyChangedEventHandler PropertyChanged;

private void NPC(string s)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(s));
}
}

我也试过像这样绑定(bind)内容控件......

<ContentControl Content="{Binding SelectedUCVMl, Mode=OneWay}"/>
<ListBox x:Name="lb_UCs" ItemsSource="{Binding UCs}" SelectedItem="{Binding SelectedUCVM}" DisplayMemberPath="CoolText"/>

……等等……

<ContentControl Content="{Binding UCs/}"/>
<ListBox x:Name="lb_UCs" ItemsSource="{Binding UCs}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="CoolText"/>

但无济于事。

如有任何帮助,我们将不胜感激。

最佳答案

看起来你只需要从 uc.xaml 中删除这部分:

    <Grid.DataContext>
<local:ucvm/>
</Grid.DataContext>

每次创建 uc.xaml 实例时,此语法都会创建 View 模型的新实例,这当然不是您想要的。您希望 uc.xaml 实例的数据上下文继承当前在列表框中选择的实例。

关于c# - ListBox 未正确更改 ContentControl 的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327764/

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