WPF 从视图模型访问代码隐藏
WPF accessing code-behind from view models
使用 NotifyIcon project 在我的 C# 应用程序中显示气球。
我希望程序中的触发器在发生时显示为 popup/balloon。问题是我只能在 .xaml.cs 文件的代码隐藏中看到如何使用 .ShowCustomBalloon 方法显示气球,这在我的 ViewModel 中没有上下文。项目中的示例之所以有效,是因为它们使用代码隐藏来显示气球内容。
我需要的是一种在 .xaml 文件上设置事件侦听器的方法,它可以触发此显示气球,绑定到 viewModel 的 属性。问题是我在 c# 应用程序开发方面的经验。不是很好,我想知道如何解决这个问题。
在代码隐藏(视图)中,您应该订阅 属性 更改事件(或其他一些事件,这实际上取决于您的 ViewModel 实现)。
这是示例 ViewModel:
public class SomeViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string someProperty;
public string SomeProperty
{
get { return someProperty; }
set
{
someProperty = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这是示例视图:
public partial class SomeView : Window
{
public DiscImageView()
{
// ...
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(SomeViewModel.SomeProperty))
{
// Logic for changed property event
}
}
}
也考虑使用一些 MVVM 库或框架,它们大大简化了生活。我建议 MVVMLight, besides other it has messaging capabilities.
使用 NotifyIcon project 在我的 C# 应用程序中显示气球。
我希望程序中的触发器在发生时显示为 popup/balloon。问题是我只能在 .xaml.cs 文件的代码隐藏中看到如何使用 .ShowCustomBalloon 方法显示气球,这在我的 ViewModel 中没有上下文。项目中的示例之所以有效,是因为它们使用代码隐藏来显示气球内容。
我需要的是一种在 .xaml 文件上设置事件侦听器的方法,它可以触发此显示气球,绑定到 viewModel 的 属性。问题是我在 c# 应用程序开发方面的经验。不是很好,我想知道如何解决这个问题。
在代码隐藏(视图)中,您应该订阅 属性 更改事件(或其他一些事件,这实际上取决于您的 ViewModel 实现)。
这是示例 ViewModel:
public class SomeViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string someProperty;
public string SomeProperty
{
get { return someProperty; }
set
{
someProperty = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这是示例视图:
public partial class SomeView : Window
{
public DiscImageView()
{
// ...
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(SomeViewModel.SomeProperty))
{
// Logic for changed property event
}
}
}
也考虑使用一些 MVVM 库或框架,它们大大简化了生活。我建议 MVVMLight, besides other it has messaging capabilities.