WPF C#RadioButton可见性在课堂上不起作用
我正在使用BoolToVisConverter绑定单选按钮可见性 我将其放在xaml文件中:WPF C#RadioButton可见性在课堂上不起作用,c#,wpf,mvvm,binding,boolean,C#,Wpf,Mvvm,Binding,Boolean,我正在使用BoolToVisConverter绑定单选按钮可见性 我将其放在xaml文件中: xmlns:VM="clr-namespace:ScreenS.ViewModel" <Window.DataContext> <VM:MainViewModel /> </Window.DataContext> <Window.Resources> <BooleanToVisibilityConverter x:Key="Bo
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}" />
最后,在主窗口文件中,我设置:
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;
}
这不会设置可见性
我有点迷路了,哪里出了问题?您必须注意实例化视图模型的方式,尤其是在共享视图模型时。现在,所有依赖类型都使用自己的
MainViewModel
(或不同的引用)实例。这就是为什么修改一个实例的值不会反映在另一个实例上
利用资源字典
。考虑通过在App.xAML资源中创建共享实例,使<代码>主视图模型< /代码>全局可访问。
App.xaml
<Application ... >
<Application.Resources>
<ResourceDictionary>
<VM:MainViewModel x:Key="SharedMainViewModel" />
</ResourceDictionary>
</Application.Resources>
</Application>
<Window.DataContext>
<StaticResource ResourceKey="SharedMainViewModel" />
</Window.DataContext>
Abc.cs
class Abc
{
private MainViewModel mainViewModel;
public Abc()
{
this.mainViewModel = Application.Current.Resources["SharedMainViewModel"] as MainViewModel;
}
}
“我哪里出错了”-您有3个不同的MainViewModel实例:
,DataContext=new MainViewModel()代码>,MainViewModel viewModel=newmainviewmodel()代码>。您需要使用一个稍有帮助的工具,您能顺便提供一些详细信息吗?为什么abc类与mainwindowviewmodel完全断开连接?如果它实际上是一个模型类,则更常见的做法是在mainwindowviewmodel中实例化它或解析实例。解析为使用依赖项注入容器。
public MainWindow()
{
InitializeComponent();
// The DataContext is initialized via XAML
}
class Abc
{
private MainViewModel mainViewModel;
public Abc()
{
this.mainViewModel = Application.Current.Resources["SharedMainViewModel"] as MainViewModel;
}
}