我想将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按钮启用,依此类推。
答案 0 :(得分:3)
multithreading
我直接使用UserControl的DataContext而不是DataGrid的DataContext。 实际上,在您的情况下,Button的DataContext将被设置为DataGrid中的每个项目。要访问UserControl上的属性,您需要进行此更改。此外,您不需要再次设置DataContext,因此我删除了该行。
我认为你有两种可能性。在ViewModel中设置标志,并且所有按钮都可以通过相对源语法访问该标志,或者如果您在模型中有它,您将在DataGrid中为每一行添加一个标志。在任何一种情况下,你都有回复:
如果它在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.如果它在ViewModel中,请使用
IsEnabled = {Binding IsStartButtonEnable }
我没有看到其他选项,但如果您希望它可用于DataGrid中的所有按钮,则必须在ViewModel中设置它。