将位于数据网格内的按钮的IsEnable属性绑定到变量

时间:2015-06-08 08:07:39

标签: wpf mvvm

我想将button的IsEnable属性绑定到变量。在数据网格中添加了按钮。数据网格位于用户控件内。 下面的代码不起作用。

 <DataGridTemplateColumn Header="Start"  >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Start_Button"
                                 DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext}" 
                                  IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}},Path=IsStartButtonEnable}"
                            Command="{Binding StartCommand}">START
                        </Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

模型包含 - (ServerModel.cs)

        private bool _isStartButtonEnable = false;

    public bool IsStartButtonEnable
    {
        get
        {
            return _isStartButtonEnable;
        }
        set
        {
            _isStartButtonEnable = value;
            this.OnPropertyChanged("IsStartButtonEnable");
        }
    }

View Model(ServerViewModel.cs)包含 -

  public static ObservableCollection<ServerModel> DataGridServerList { get; set; }

UserControl(ServerUserControl.cs)包含 -

  this.DataContext = new ServerViewModel();

要求 - UserControl包含3个按钮 - 创建,开始和停止。用户单击“创建”按钮。如果Create commnd成功,则启用Start按钮。然后用户单击Start按钮。如果start commnd成功执行,则Stop按钮启用,依此类推。

1 个答案:

答案 0 :(得分:3)

multithreading

我直接使用UserControl的DataContext而不是DataGrid的DataContext。 实际上,在您的情况下,Button的DataContext将被设置为DataGrid中的每个项目。要访问UserControl上的属性,您需要进行此更改。此外,您不需要再次设置DataContext,因此我删除了该行。

我认为你有两种可能性。在ViewModel中设置标志,并且所有按钮都可以通过相对源语法访问该标志,或者如果您在模型中有它,您将在DataGrid中为每一行添加一个标志。在任何一种情况下,你都有回复:

  1. 如果它在Model中,请将DataGrid ItemsSource设置为ObservableCollection并使用

    <DataGridTemplateColumn Header="Start"  >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Start_Button"
                                 IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext.IsStartButtonEnable}"
                            Command="{Binding StartCommand}">START
                        </Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    
  2. 2.如果它在ViewModel中,请使用

    IsEnabled = {Binding IsStartButtonEnable }
    

    我没有看到其他选项,但如果您希望它可用于DataGrid中的所有按钮,则必须在ViewModel中设置它。