gpt4 book ai didi

c# - 使用 MVVM 时的 WPF 绑定(bind)问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:14 25 4
gpt4 key购买 nike

我的第一个问题到了:)

我有以下内容:

public class BuilderViewModel : INotifyPropertyChanged
{
#region Implementation of INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

#endregion

private double _contentScale = 1.0;

public double ContentScale
{
get { return _contentScale; }
set
{
_contentScale = value;
NotifyPropertyChanged("ContentScale");
}
}

public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

#region Commands

bool CanZoomIn() { return true; }
void ZoomInExecute()
{
ContentScale += 1.0;
}

public ICommand ZoomIn { get { return new RelayCommand(ZoomInExecute, CanZoomIn); } }

#endregion
}

以及相应的 View :

<UserControl x:Class="PS_IDE.FormBuilder.View.Builder"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:PS_IDE.FormBuilder.ViewModel">
<UserControl.DataContext>
<local:BuilderViewModel />
</UserControl.DataContext>

<TextBox Text="{Binding ContentScale}" Width="100" />

</UserControl>

我试图让 BuilderViewModel 中的 ZoomIn 命令更新其 View 中的文本框值。该命令是从另一个用户控件 UIBuilder 触发的,其中包含 Builder。如果我从 UIBuilder 调试并触发命令,我可以看到它正确地更新了 ContentScale。

但是,我的文本框值没有得到更新(它只显示“1”,这是 ContentScale 的初始值)。

我知道我遗漏了一些东西,希望有人能为我指明正确的方向。

编辑:添加了触发命令的控件

<UserControl x:Class="PS_IDE.FormBuilder.UIBuilder"
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:PS_IDE.FormBuilder"
xmlns:ViewModel="clr-namespace:PS_IDE.FormBuilder.ViewModel"
xmlns:View="clr-namespace:PS_IDE.FormBuilder.View" mc:Ignorable="d">
<UserControl.DataContext>
<ViewModel:BuilderViewModel />
</UserControl.DataContext>
<DockPanel LastChildFill="True">

....

<ToolBarTray DockPanel.Dock="Bottom" HorizontalAlignment="Right">
<ToolBar>
<Button Height="24" Width="24" ToolTip="Zoom In" Command="{Binding ZoomIn}">
<Image Source="Images/ZoomIn.png" Height="16"/>
</Button>

....

</ToolBar>
</ToolBarTray>
<View:Builder x:Name="builder" />
</DockPanel>
</UserControl>

最佳答案

设置在两个 View 中:

<UserControl.DataContext>
<local:BuilderViewModel />
</UserControl.DataContext>

您基本上是在创建两个 View 模型,每个 View 一个。因此,当您的命令更新属性时,它会在其中一个 View 模型上执行此操作,但您的文本框绑定(bind)到不同的 View 模型。

要解决此问题,请从 Builder.xaml

删除 DataContext 设置

此外,您需要将您的 DataContext 传递给您的 Builder 控件(这样两个 View 将共享相同的 View 模型)。

因此修改您的 UIBuilder.xaml:

<View:Builder x:Name="builder" DataContext="{Binding}" />

关于c# - 使用 MVVM 时的 WPF 绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095486/

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