对于button的使用一般都不会涉及需要将content属性做绑定数据的操作。所以在网上也找到的有关资料也比较少。
现在我有一种需要,一个按钮显示的Content是根据绑定的字符串来的。
最开始我的做法是
<Grid x:Name="grid">
<Button x:Name="button" Width="100" Height="30" Content="{Binding Text}" Click="Button_Click"></Button>
</Grid>
这个Text就是一个public string Text="xxxxx";
很显然没有起任何作用;
改进版的
private string _Text;
public string Text
{
get { return _Text; }
set { _Text = value; }
}
依然不起作用,然后在网上找到的一些资料发现,Content不是string类型,而是object类型,不能直接绑定字符串;
接下来的做法是新建一个类,绑定一个类中的数据
public class ButBindingData
{
public ModelButBindingData()
{
Text = "列表模式";
}
private string _Text ;
public string Text
{
get { return _Text; }
set { _Text = value; }
}
}
依然无效,于是我在代码里手动写上了绑定
Binding binding = new Binding();
binding.Source = data;
binding.Path = new PropertyPath("Text");
button.SetBinding(Button.ContentProperty, binding);
我发现,手动设置这样的绑定是起作用的,那么为什么在xmal里设置不起作用呢。
左思右想,找了许多资料,发现了被我遗漏的最重要的一点,上下文属性未设置,那当然找不到要绑定的数据啊
所以最关键的一点是
grid.DataContext = data;
那么xmal里就可以这样写了
<Grid x:Name="grid">
<Button x:Name="button" Width="100" Height="30" Content="{Binding Text}" Click="Button_Click"></Button>
</Grid>
正确显示!
为了达到数据及时更新的目的,还需要一些操作:
public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public class ModelButBindingData : PropertyChangedBase
{
public ModelButBindingData()
{
Text = "666";
}
private string _Text ;
public string Text
{
get { return _Text; }
set { _Text = value; Notify("Text"); }
}
}
就是Text这个数据有变更是会及时通知UI主界面更新显示数据。
当然别忘了数据要
public ModelButBindingData data = new ModelButBindingData();
public属性,还要new出来。
以上就是实现Button的Content绑定数据的操作。