gpt4 book ai didi

wpf - 根据 View 模型中的更改更新依赖属性

转载 作者:行者123 更新时间:2023-12-03 10:16:29 25 4
gpt4 key购买 nike

我在 WPF 中的数据绑定(bind)方面遇到了一些问题。这是场景:我制作了一个模拟拨号盘的用户控件(即,一个由 12 个按钮组成的数组,数字从“0”到“9”加上“#”和“清除”键)。该控件位于类库中,它是按照 MVVM 模式实现的,主要是因为我需要类库中的组件易于进行单元测试。

控件的 View 模型非常简单,每次用户按下拨号盘按键时,它基本上都会更新一个公共(public)的“DialedNumber”字符串(内部连接到模型)。绑定(bind)工作正常,通过使用调试器,我可以确认 View 模型中的“DialedNumber”变量正在更新,因为我按下拨号盘中的按钮。

这个 DialPad 控件由一个单独的 XAML 文件 (Panel.xaml) 使用,该文件列出了属于我的自定义类库的几个控件。

现在,我想在 Panel 文件中添加一个 TextBlock,以显示 DialPad 中保存的“DialedNumber”字符串。这是 Panel.xaml 中的代码片段:

<PanelControls:DialPad x:Name="MyDialPad" DialedNumber="55325"/>
<TextBlock Text="{Binding ElementName=MyDialPad, Path=DialedNumber}" />

我得到的结果是文本 block 在开始时显示正确的数字(即“55325”),但是当我按下拨号盘键时它的内容没有得到更新(即使拨号盘的 View 模型在我按下时得到更新)新键,正如我用调试器检查过的那样)。

下面是 DialPad View 的代码:
public partial class DialPad : UserControl
{
public DialPad()
{
InitializeComponent();
DataContext = new DialPadViewModel();
}

public void DialedNumberChanged(object sender, EventArgs e)
{
return;
}

public DialPadViewModel DialPadViewModel
{
get { return DataContext as DialPadViewModel; }
}

public string DialedNumber
{
get
{
var dialPadViewModel = Resources["DialPadVM"] as DialPadViewModel;
return (dialPadViewModel != null) ? dialPadViewModel.DialedNumber : "";
}
set
{
var dialPadViewModel = Resources["DialPadVM"] as DialPadViewModel;
if (dialPadViewModel != null)
{
dialPadViewModel.DialedNumber = value;
}
}
}
}

这是 DialPad View 模型:
public class DialPadViewModel : ObservableObject
{
public DialPadViewModel()
{
_dialPadModel = new DialPadModel();
}

#region Fields

private readonly DialPadModel _dialPadModel;
private ICommand _dialPadKeyPressed;

#endregion

#region Public Properties/Command

public DialPadModel DialPadModel
{
get { return _dialPadModel; }
}

public ICommand DialPadKeyPressedCommand
{
get
{
if (_dialPadKeyPressed == null)
{
_dialPadKeyPressed = new RelayCommand(DialPadKeyPressedCmd);
}
return _dialPadKeyPressed;
}
}

public string DialedNumber
{
get { return _dialPadModel.DialedNumber; }
set
{
_dialPadModel.DialedNumber = value;
RaisePropertyChanged("DialedNumber");
}
}

#endregion

#region Private Helpers

private void DialPadKeyPressedCmd(object parameter)
{
string keyPressedString = parameter.ToString();

if (keyPressedString.Length > 0)
{
if (char.IsDigit(keyPressedString[0]))
{
DialedNumber += keyPressedString[0].ToString(CultureInfo.InvariantCulture);
}
else if (keyPressedString == "C" || keyPressedString == "Clr" || keyPressedString == "Clear")
{
DialedNumber = "";
}
}
}

#endregion
}

让我重申一下我的问题:Panel.xaml 中的文本 block 在开始时显示正确的数字 (55325),但当我按下 DialPadButtons 时它的值永远不会更新。我在 DialPadKeyPressedCmd 中放置了一个断点,我可以确认每次按下拨号盘中的键时都会执行该方法。

最佳答案

如果将 DialPad 放在 View 中,则可以在 ViewViewModel 中创建 DialPadViewModel-Property (public+global):

public DialPadViewModel DialPadViewModel = new DialPadViewModel();

现在将 View 的 DataContext-Binding 设置为 ViewViewModel 并将 DialPads DataContext 也绑定(bind)到它,例如
<local:DialPad DataContext="{Binding}"/>

现在您可以绑定(bind)到 DialPadViewModel 中的属性:
<TextBox Text="{Binding Path=DialPadViewModel.DialedNumber}"/>

这就是你如何从你的 View 和你的拨号盘访问你的拨号盘 View 模型。

编辑:

现在尝试更改 DialPad.xaml.cs 中的 DialedNumber 属性,如下所示:
public string DialedNumber
{
get
{
return DialPadViewModel.DialedNumber;
}
set
{
DialPadViewModel.DialedNumber = value;
}
}

编辑2:我发现了问题:

在您的 DialPad.xaml 中,您的所有命令都从资源绑定(bind)到 DialPadViewModel,而 TextBloc 绑定(bind)到 DialPads DataContext,这是 DialPadViewModel 的另一个实例。

因此,每次您点击 DialPad-Button 时,您都会从资源的 DPVM 实例中更改 DialedNumber 的值,而不是从 DataContext 的 DPVM 实例中更改 DialedNumber。

关于wpf - 根据 View 模型中的更改更新依赖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625232/

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