MVVM按钮可见性

Mws*_*cer 1 c# wpf xaml mvvm

我有一个在我的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>
Run Code Online (Sandbox Code Playgroud)

视图模型:

项目用户可以选择:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

用户选择行时调用的方法

public void OnSelect_Row()
{
    btn_update_visiblity = "Visible";
    MessageBox.Show("Update Button is " + Btn_Update_Visibility.ToString());
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加构造函数我的构造函数:

    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";
        }
     }
Run Code Online (Sandbox Code Playgroud)

Dav*_*idG 5

您是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());
}
Run Code Online (Sandbox Code Playgroud)

但部分相关的是您对变量和方法的命名.常见的C#约定会稍微澄清你的代码会让它更像这样(还有其他一些样式改进):

private string _buttonUpdateVisibility;

public string ButtonUpdateVisibility
{
    get => _buttonUpdateVisibility;
    set
    {
        _buttonUpdateVisibility= value;
        OnPropertyChanged(nameof(ButtonUpdateVisibility));
    }
}
Run Code Online (Sandbox Code Playgroud)