Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 将按钮的属性绑定到静态字段类(MVVM)_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 将按钮的属性绑定到静态字段类(MVVM)

C# 将按钮的属性绑定到静态字段类(MVVM),c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我的主窗口上有按钮,我想通过静态字段类启用和禁用该控件。这是否可能,而不去后面的代码 主窗口 我的虚拟机 私有静态对象\u selectedItem; 公共静态对象SelectedItem { 获取{return\u selectedItem;} 设置{ 如果(SelectedItem!=null) { //启用控制 } 其他的 { //禁用控制 } _selectedItem=value;} } 私有布尔值_enableDisable; 公共布尔启用禁用 { 获取{return\u ena

我的主窗口上有按钮,我想通过静态字段类启用和禁用该控件。这是否可能,而不去后面的代码

主窗口


我的虚拟机

私有静态对象\u selectedItem;
公共静态对象SelectedItem
{
获取{return\u selectedItem;}
设置{
如果(SelectedItem!=null)
{
//启用控制
}
其他的
{
//禁用控制
}
_selectedItem=value;}
}
私有布尔值_enableDisable;
公共布尔启用禁用
{
获取{return\u enableDisable;}
设置{u enableDisable=value;OnPropertyChanged(“enableDisable”);}
}
您可以尝试以下方法:

<Window.Resources>
    <yourNS:YourMVVM x:Key="mvvm"/>
</Window.Resources>


在这种情况下使用
静态属性时存在一些问题。我有一个解决这个问题的办法。请参阅下面适合您的代码片段

public partial class MainWindow : Window,INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged;
    public static object mySharedVariableToOtherClass = value;
    private object _selectedItem;

    public object SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            mySharedVariableToOtherClass = null;
            OnPropertyChanged("SelectedItem");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        SelectedItem = "vimal";
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SelectedItem = null;
    }
    public void OnPropertyChanged(string PropertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(PropertyName));    
        }
    }
}
在上面的代码片段中,我声明了
SelectedItem
属性是一个普通的
属性
,用于绑定到
UIElement
。我还声明了一个名为
mySharedVariableToOtherClass
属性
,它是
静态的
,用于设置
SelectedItem
属性中的值。这是静态的,因此您也可以从其他类访问它。在我的openion中,
触发器
是禁用
按钮
控件的正确选择

<Grid Name="MainGrid">
    <Button Width="100"
            Height="40"
            Click="Button_Click">
        <Button.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=SelectedItem}"
                                 Value="{x:Null}">
                        <Setter Property="Button.IsEnabled"
                                Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <TextBlock Width="200"
               Height="30"
               Text="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
               Margin="74,46,69,154" />

</Grid>

尝试以下链接中提到的方法


不能直接绑定到静态属性。 如果您真的需要这个属性是静态的,一种方法是创建一个代理属性来获取和设置它。这是基于


你能行!阅读此处:它只执行代码,当单击1个按钮时,它需要更新您需要的特定操作,其他按钮将被禁用?要使更新生效,您需要实现
INotifyPropertyChanged
,简而言之,这意味着没有静态属性。为什么它需要是静态的?其他类需要访问它。mainwindow有按钮,usercontrol有datagrid。单击行datagrid按钮时,该按钮变为启用状态,如果==null,则禁用
<Grid Name="MainGrid">
    <Button Width="100"
            Height="40"
            Click="Button_Click">
        <Button.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=SelectedItem}"
                                 Value="{x:Null}">
                        <Setter Property="Button.IsEnabled"
                                Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <TextBlock Width="200"
               Height="30"
               Text="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
               Margin="74,46,69,154" />

</Grid>
private static readonly ClassName _this = new ClassName();

public object ProxySelectedItem
{
    get { return SelectedItem; }
    set { SelectedItem = value; }
}

private static object _selectedItem;
public static object SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (SelectedItem != null)
        {
            _this.EnableDisable = true;
        }
        else
        {
            _this.EnableDisable = false;
        }
        _selectedItem = value;
        _this.OnPropertyChanged("ProxySelectedItem");
    }
}

private bool _enableDisable;
public bool EnableDisable
{
    get { return _enableDisable; }
    set 
    {
        _enableDisable = value;
        OnPropertyChanged("EnableDisable"); 
    }
}