在xaml文件中按钮的数据绑定IsEnabled

时间:2010-08-12 19:44:35

标签: silverlight datagrid

我想将按钮IsEnabled属性绑定到由WCF Web服务重新归档的bool值。

以下是详细信息......

我的xaml文件中有一个datagrid。在这个网格中,我有一个按钮作为DataGridTemplateColumn的一部分。现在我想将此按钮的isenable数据绑定到Web服务返回的bool值。

我们不能做一些非常简单的事情,比如......

<Button x:Name="btnUpdRequest" Content="Update" Click="btnUpdRequest_Click" Margin="2" IsEnabled="{Binding isUpdateable}" />

其中isUpdateable是Web服务返回的值之一。

谢谢..

1 个答案:

答案 0 :(得分:2)

你所描述的是非常可行的,但是......首先,确保isUpdatable是(a)在当前DataContext上的公共属性,(b)在更新时适当地引发PropertyChanged事件(或者是DependencyProperty),并且(c)被设置为期望的初始值。您的Web服务调用将是异步的(Silverlight中的Web服务调用是Async),因此如果您使用的是除了vanilla异步模型之外的任何其他模型(在您调用之前挂钩事件并在事件处理程序中设置您的值 - 并且事件处理程序保证在UI线程上)您可能需要将您的值封送回UI线程以防止令人讨厌的异常。

请记住,由于调用的异步性质,只有在调用返回后,按钮才会更新为所需的值,因此请正确设置初始值(启用或禁用,具体取决于您的需要。)

这是一个快速的&amp;脏样本(服务调用只是将它接收的值作为参数切换):

代码隐藏:

public partial class MainPage : UserControl, INotifyPropertyChanged
{
    public MainPage()
    {
        InitializeComponent();
    }

    private bool _isUpdatable;
    public Boolean IsUpdatable
    {
        get { return _isUpdatable; }
        set
        {
            if (_isUpdatable != value)
            {
                _isUpdatable = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsUpdatable"));
            }

        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void CallTheService_Click(object sender, RoutedEventArgs e)
    {
        var serviceProxy = new Service1Client();
        serviceProxy.ToggleCompleted += new EventHandler<ToggleCompletedEventArgs>(serviceProxy_ToggleCompleted);
        serviceProxy.ToggleAsync(IsUpdatable);
    }

    private void serviceProxy_ToggleCompleted(object sender, ToggleCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            IsUpdatable = e.Result;
        }
    }
}

XAML:

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding ElementName=window1}">
    <Button IsEnabled="{Binding IsUpdatable}" Content="Foo" Height="100" VerticalAlignment="Top"/>
    <Button Content="Toggle Foo" Height="100" VerticalAlignment="Bottom" Click="CallTheService_Click" />
</Grid>