我有一个按钮,在我的ViewModel构造函数中设置为隐藏。 当用户点击一个项目时,该按钮应该可见。 我的断点和消息框显示可见性的值正在变为“可见”所以我不确定我在绑定中缺少什么。
XAML:
<Button Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="105,22,0,21" Style="{StaticResource MetroButton}" Width="90" Height="57" Click="btn_Update_Click" RenderTransformOrigin="0.49,0.287" Visibility="{Binding Btn_Update_Visibility, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <TextBlock Text="Update Request" TextWrapping="Wrap" TextAlignment="Center"/> </Button>视图模型:
项目用户可以选择:
private DataRowView select_request; public DataRowView Select_Request { get { return select_request; } set { select_request = value; OnPropertyChanged("Select_Request"); //Get the Check Request ID OnSelect_RequestChange(); //Make Update Button Visible OnSelect_Row(); } }将可见性绑定到XAML中的值
private string btn_update_visiblity; public string Btn_Update_Visibility { get { return btn_update_visiblity; } set { btn_update_visiblity = value; OnPropertyChanged("Btn_Update_Visibility"); } }当用户选择行时调用的方法
public void OnSelect_Row() { btn_update_visiblity = "Visible"; MessageBox.Show("Update Button is " + Btn_Update_Visibility.ToString()); }编辑:添加构造函数我的构造函数:
public LandingPageMVVM() { Search_User = MyCommonValues.UserName; btn_update_visiblity = "Hidden"; //Check if Manager #region Manager Check bool? manager_check = MyCommonValues.manager_check; if (manager_check == true) { MessageBox.Show("Welcome Manager"); btn_review_visibility = "Visible"; } else { MessageBox.Show("Welcome User"); btn_review_visibility = "Hidden"; } }I have a button that is set to Hidden in my ViewModel constructor. When the user clicks on an item the button should become visible. My break points and messagebox show that the value of the Visibility is being change to "Visible" So I'm not sure what I am missing in my binding.
XAML:
<Button Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="105,22,0,21" Style="{StaticResource MetroButton}" Width="90" Height="57" Click="btn_Update_Click" RenderTransformOrigin="0.49,0.287" Visibility="{Binding Btn_Update_Visibility, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <TextBlock Text="Update Request" TextWrapping="Wrap" TextAlignment="Center"/> </Button>ViewModel:
Items User can select:
private DataRowView select_request; public DataRowView Select_Request { get { return select_request; } set { select_request = value; OnPropertyChanged("Select_Request"); //Get the Check Request ID OnSelect_RequestChange(); //Make Update Button Visible OnSelect_Row(); } }Value to Bind Visibility To in XAML
private string btn_update_visiblity; public string Btn_Update_Visibility { get { return btn_update_visiblity; } set { btn_update_visiblity = value; OnPropertyChanged("Btn_Update_Visibility"); } }Method that is called when user selects row
public void OnSelect_Row() { btn_update_visiblity = "Visible"; MessageBox.Show("Update Button is " + Btn_Update_Visibility.ToString()); }Edit: Adding Constructor My Constructor:
public LandingPageMVVM() { Search_User = MyCommonValues.UserName; btn_update_visiblity = "Hidden"; //Check if Manager #region Manager Check bool? manager_check = MyCommonValues.manager_check; if (manager_check == true) { MessageBox.Show("Welcome Manager"); btn_review_visibility = "Visible"; } else { MessageBox.Show("Welcome User"); btn_review_visibility = "Hidden"; } }最满意答案
您正在直接设置btn_update_visibility字段的值,而不是通过Btn_Update_Visibility属性。 这意味着OnPropertyChanged("Btn_Update_Visibility")方法永远不会被调用以指示视图需要更改。
相反,你的代码应该是:
public void OnSelect_Row() { Btn_Update_Visibility = "Visible"; MessageBox.Show("Update Button is " + Btn_Update_Visibility.ToString()); }部分相关的是你的变量和方法的命名。 常见的C#约定,它会稍微澄清你的代码会让它更像这样(还有一些其他的样式改进):
private string _buttonUpdateVisibility; public string ButtonUpdateVisibility { get => _buttonUpdateVisibility; set { _buttonUpdateVisibility= value; OnPropertyChanged(nameof(ButtonUpdateVisibility)); } }You are setting the value of btn_update_visibility field directly instead of via the Btn_Update_Visibility property. This means the OnPropertyChanged("Btn_Update_Visibility") method never gets called to indicate the view needs to change.
Instead your code should be:
public void OnSelect_Row() { Btn_Update_Visibility = "Visible"; MessageBox.Show("Update Button is " + Btn_Update_Visibility.ToString()); }Partially related though is your naming of variables and methods. Common C# convention, which would clarify your code somewhat would have it a little more like this (with some other styling improvements too):
private string _buttonUpdateVisibility; public string ButtonUpdateVisibility { get => _buttonUpdateVisibility; set { _buttonUpdateVisibility= value; OnPropertyChanged(nameof(ButtonUpdateVisibility)); } }更多推荐
发布评论