我想将按钮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服务返回的值之一。
谢谢..
答案 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>