【问题标题】:Databinding IsEnabled of button in a xaml filexaml 文件中按钮的数据绑定 IsEnabled
【发布时间】:2010-08-12 19:44:35
【问题描述】:

我想将按钮 IsEnabled 属性绑定到由 WCF Web 服务返回的布尔值。

以下是详细信息...

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

我们不能做一些非常简单的事情吗?..

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

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

谢谢..

【问题讨论】:

  • 你能提供更多关于它究竟是如何失败的细节吗?我看不出绑定不能工作的任何原因。
  • 我在触发事件时遇到了问题。但是 avidgator 的观点帮助了我。谢谢。

标签: silverlight datagrid


【解决方案1】:

您所描述的内容非常可行,但是...首先,确保 isUpdatable 是一个公共属性,它 (a) 在当前 DataContext 上,(b) 在更新时正确引发 PropertyChanged 事件(或者是 DependencyProperty),并且 (c) 设置为所需的初始值。您的 Web 服务调用将是异步的(Silverlight 中的 Web 服务调用是异步的)因此,如果您使用的不是普通异步模型(在该模型中您在进行调用之前挂钩事件并在事件处理程序中设置您的值) - 和事件处理程序保证在 UI 线程上)您可能需要将您的值编组回 UI 线程以防止出现令人讨厌的异常。

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

这是一个快速而肮脏的示例(服务调用只是切换它作为参数接收的值):

代码隐藏:

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>

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2023-03-09
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多