gpt4 book ai didi

c# - 如何在不使用 MVVM 的情况下绑定(bind) DependencyProperty

转载 作者:行者123 更新时间:2023-11-30 16:57:21 24 4
gpt4 key购买 nike

好吧,我正在做一个小项目,我发现没有必要实现完整的 MVVM。

我正在尝试在代码隐藏中绑定(bind)一些属性,但无法使其正常工作。

重点是在代码隐藏中使用 DependencyProperties 和 Binding。

我尝试在 SO 中关注这些链接和问题:

Bind Dependency Property in codebehind WPF

How to: Create a Binding in Code

Bind Dependency Property, defined in Code-Behind, through Xaml to a Property in the DataContext of a UserControl

但它们与 MVVM 相关,或者至少我无法根据我的情况调整代码。

这个例子应该很简单。

MainWindow.xaml

<Label Name="_lblCurrentPath"
Style="{StaticResource CustomPathLabel}"
ToolTip="{Binding CurrentPath}"
Content="{Binding CurrentPath, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>

MainWindow.xaml.cs

public MainWindow()
{
InitializeComponent();
SetBindings();
}

#region Properties

public static readonly DependencyProperty CurrentPathProperty =
DependencyProperty.Register("CurrentPath", typeof(String), typeof(MainWindow), new PropertyMetadata(String.Empty, OnCurrentPathChanged));


public string CurrentPath
{
get { return (String)GetValue(CurrentPathProperty); }
set { SetValue(CurrentPathProperty, value); }
}


#endregion

#region Bindings

private void SetBindings()
{
// Label CurrentPath binding
Binding _currentPath = new Binding("CurrentPath");
_currentPath.Source = CurrentPath;
this._lblCurrentPath.SetBinding(Label.ContentProperty, _currentPath);
}

#endregion

#region Methods

private void Refresh()
{
MessageBox.Show("Refresh!");
}

private string Search()
{
WinForms.FolderBrowserDialog dialog = new WinForms.FolderBrowserDialog();

WinForms.DialogResult _dResult = dialog.ShowDialog();

switch(_dResult)
{
case WinForms.DialogResult.OK:
CurrentPath = dialog.SelectedPath;
break;
default:
break;
}

return CurrentPath;
}

#endregion

#region Events

private static void OnCurrentPathChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MainWindow instance = d as MainWindow;
instance.Refresh();
}

public void OpenSearchEclipsePath(object sender, RoutedEventArgs e)
{
CurrentPath = Search();
}

public void RefreshEclipsePath(object sender, RoutedEventArgs e)
{
Refresh();
}

有什么想法吗?

。如果这是一个不好的做法,我应该使用 MVVM,我们欢迎评论。

。另外...与 Command 属性相关。在这种情况下,我不想使用 MVVM 方法,注册事件会更好吗?我发现自定义命令绑定(bind)的使用有点乏味。

最佳答案

首先,您完全可以在没有 MVVM 的情况下使用绑定(bind)。我不推荐它,因为当您使用 MVVM 时代码会更清晰,但它可以完成。您需要做的就是将这一行放在您的构造函数中:

this.DataContext = this;

现在您的 View 也是您的 View 模型!就像我说的,这不是个好主意。

现在,您的代码在 MainWindow 类中有一个 DependencyProperty不要那样做。它绝对没有任何用处。 DP 在那里,因此 控件可以对它们进行绑定(bind)。 MainWindow 没有父窗口;所以 DP 是没用的。

您需要做的就是设置一个常规属性:

public string CurrentPath
{
get { return currentPath; }
set
{
currentPath = value;
NotifyPropertyChanged();
}
}

然后让 MainWindow 实现 INotifyPropertyChanged(我有没有提到使用简单的 View 模型更有意义?)。

回答您的 Command 问题。是的,如果您反对使用命令,只需注册事件即可。但是,Command 是让用户点击 View 模型而不破坏 MVVM 的一种非常好的方式。语法还不错。。不过,如果您无论如何都采用“View as a View Model”方法,Command 不会给您带来太多好处。

关于c# - 如何在不使用 MVVM 的情况下绑定(bind) DependencyProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742859/

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