Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用viewmodel在WPF的窗口中使控件可见和隐藏?_C#_Wpf_Mvvm_Viewmodel_Visibility - Fatal编程技术网

C# 无法使用viewmodel在WPF的窗口中使控件可见和隐藏?

C# 无法使用viewmodel在WPF的窗口中使控件可见和隐藏?,c#,wpf,mvvm,viewmodel,visibility,C#,Wpf,Mvvm,Viewmodel,Visibility,我实现了一个文本框,当复选框未选中时,文本框必须可见,反之亦然。 以下是我的看法: <TextBox Visibility="{Binding VisiMaxTime}" Height="23" HorizontalAlignment="Left" Margin="165,36,0,0" Text="{Binding Path=MaxTime,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" VerticalAlignment="Top"

我实现了一个文本框,当复选框未选中时,文本框必须可见,反之亦然。 以下是我的看法:

 <TextBox Visibility="{Binding VisiMaxTime}" Height="23" HorizontalAlignment="Left" Margin="165,36,0,0" Text="{Binding Path=MaxTime,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" VerticalAlignment="Top" Width="75" />
 <CheckBox IsChecked="{Binding MaxTimeIsChecked}" Content="Geen" FontWeight="Bold" Height="16" HorizontalAlignment="Left" Margin="104,39,0,0" Name="checkBox1" VerticalAlignment="Top" />
所以我认为这很好,这在用户控件中工作,但现在我在窗口中工作。如果我在可见性的setters中设置了一个断点,它可以正常工作,但是文本框就是不可见?有人知道我做错了什么吗


谢谢

我想您需要双向绑定:

<CheckBox IsChecked="{Binding MaxTimeIsChecked, Mode=TwoWay}" … />

您的文本框的数据上下文是否正确


我注意到您的
MaxTime
属性在ViewModel中被定义为设置为
examicationtime.MaxTime
,而您的TextBox.Text绑定被绑定到
MaxTime
。文本框的数据上下文是您的视图模型还是您的检查时间?

如果文本框的可见性取决于复选框,为什么不直接绑定到该复选框

 <TextBox Visibility="{Binding ElementName=checkBox1,Path=IsChecked,Converter=BooleanToVisibilityConverter}" />


您需要使用BooleanToVisibilityConverter将Bool转换为Visiblity

问题在于VisiMaxTime属性不会更新MaxTimeIsChecked属性

private Visibility visiMaxTime;         
public Visibility VisiMaxTime         
{             
           get { return visiMaxTime; }             
           set             
           {   
                if (visiMaxTime == value)
                    return;           
                visiMaxTime = value;                 
                OnPropertyChanged("VisiMaxTime");   
                MaxTimeIsChecked = VisiMaxTime == Visibility.Visible;          
            }        
 } 

也就是说,您可以绑定到MaxTimeIsChecked属性并使用BooleanToVisibilityConverter

您是否正在提升
属性更改
?是的,我使用visibility属性对其进行了编辑。如果代码在用户控件中工作,它应该在窗口中工作,而不做任何更改。我看不出密码有什么问题。您是否将实际代码复制并粘贴到此问题中?尝试在OnPropertyChanged方法中设置断点,以确保按预期引发属性更改。是的,文本框绑定到viewmodel中的Maxtime属性,我在那里设置了检查对象的Maxtime。@Ruben您在问题中发布的代码工作正常。产生问题的是实际代码吗?如果我把它放进去,他会给出一个错误:“Set property”System.Windows.Data.Binding.Converter“抛出了一个异常。”行号“13”和行位置“260”。我认为它与转换器有关:我在窗口中有这样的道具:xmlns:converters=“clr namespace:toetsbeertweedezit.converters”我做错了什么?
private Visibility visiMaxTime;         
public Visibility VisiMaxTime         
{             
           get { return visiMaxTime; }             
           set             
           {   
                if (visiMaxTime == value)
                    return;           
                visiMaxTime = value;                 
                OnPropertyChanged("VisiMaxTime");   
                MaxTimeIsChecked = VisiMaxTime == Visibility.Visible;          
            }        
 }