【问题标题】:WPF C# RadioButton visibility not working from classWPF C# RadioButton 可见性在课堂上不起作用
【发布时间】:2019-08-11 07:01:57
【问题描述】:

我正在使用 BoolToVisConverter 绑定 RadioButton 可见性。

我把它放在 xaml 文件中:

xmlns:VM="clr-namespace:ScreenS.ViewModel" 

<Window.DataContext>
    <VM:MainViewModel />
</Window.DataContext>

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>  

<RadioButton x:Name="SCB0" Visibility="{Binding ShowSCB0, Converter={StaticResource BoolToVisConverter}, FallbackValue=Hidden}" />

在 MainViewModel 文件中,我输入:

using System.ComponentModel;

namespace ScreenS.ViewModel
{
public class MainViewModel : INotifyPropertyChanged
{
    private bool _scb0;

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

    public event PropertyChangedEventHandler PropertyChanged;

    public bool ShowSCB0
    {
        get { return _scb0; }
        set
        {
            _scb0 = value;
            NotifyPropertyChanged("ShowSCB0");
        }
    }
}

最后,在 MainWindow 文件中,我设置了:

public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }

    MainViewModel mainView => DataContext as MainViewModel;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        mainView.ShowSCB0 = true;
    }

到这里为止,一切都很好。 问题是当我尝试从另一个类更改此值时。 我正在使用:

class abc
{
    MainViewModel viewModel = new MainViewModel(); 

public void someFunction()
    {   
         viewModel.ShowSCB0 = true;
    }

这不会设置可见性..

我有点迷路了,我哪里错了?

【问题讨论】:

  • “我哪里出错了” - 您有 3 个不同的 MainViewModel 实例:&lt;VM:MainViewModel /&gt;DataContext = new MainViewModel();MainViewModel viewModel = new MainViewModel();。你需要和一个人合作
  • 有点帮助,能不能顺便说点细节?
  • 为什么 abc 类与 mainwindowviewmodel 完全断开?如果它实际上是一个模型类,则更常见的是实例化它或解析 mainwindowviewmodel 中的实例。解析为使用依赖注入容器。

标签: c# wpf mvvm binding boolean


【解决方案1】:

您必须注意实例化视图模型的方式,尤其是当它们共享时。现在所有依赖类型都使用它们自己的MainViewModel 实例(或不同的引用)。这就是为什么修改一个实例的值不会反映在另一个实例上的原因。

使用ResourceDictionary。考虑通过在 App.xaml 资源中创建共享实例来使 MainViewModel 全局可访问。

App.xaml

<Application ... >
  <Application.Resources>
    <ResourceDictionary>

      <VM:MainViewModel x:Key="SharedMainViewModel" />
    </ResourceDictionary>
  </Application.Resources>
</Application>

MainWindow.xaml

<Window.DataContext>
  <StaticResource ResourceKey="SharedMainViewModel" />
</Window.DataContext>

MainWindow.xaml.cs (固定构造函数)

public MainWindow()
{
  InitializeComponent();   
  // The DataContext is initialized via XAML   
}

Abc.cs

class Abc
{
  private MainViewModel mainViewModel; 

  public Abc()
  {
    this.mainViewModel = Application.Current.Resources["SharedMainViewModel"] as MainViewModel;
  }
}

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2016-03-23
    • 2012-08-08
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多