WPF 字符串属性与 Button.Content 的绑定
我想将字符串属性与 Button.Content 绑定。
但为什么没有效果呢?
数据类:
namespace test4
{
public class Test : INotifyPropertyChanged
{
string _Text = "Begin";
public string Text
{
get{return _Text;}
protected set { _Text = value; }
}
public void Start()
{
Text = "Begin";
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(Text));
}
public void End()
{
Text = "End";
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(Text));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
逻辑代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
test4.Test ttt = new test4.Test();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource testViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("testViewSource")));
testViewSource.Source = new object[]{ttt};
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (ttt.Text == "Begin")
ttt.End();
else
ttt.Start();
}
}
XAML:
<Window x:Class="test5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:test4" Loaded="Window_Loaded">
<Window.Resources>
<CollectionViewSource x:Key="testViewSource" d:DesignSource="{d:DesignInstance my:Test, CreateList=true}" />
</Window.Resources>
<Grid DataContext="{StaticResource testViewSource}">
<Button Content="{Binding Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="158,95,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
I want to bind string property with Button.Content.
But why it didn't work?
The data class:
namespace test4
{
public class Test : INotifyPropertyChanged
{
string _Text = "Begin";
public string Text
{
get{return _Text;}
protected set { _Text = value; }
}
public void Start()
{
Text = "Begin";
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(Text));
}
public void End()
{
Text = "End";
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(Text));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
The logical code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
test4.Test ttt = new test4.Test();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource testViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("testViewSource")));
testViewSource.Source = new object[]{ttt};
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (ttt.Text == "Begin")
ttt.End();
else
ttt.Start();
}
}
The XAML:
<Window x:Class="test5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:test4" Loaded="Window_Loaded">
<Window.Resources>
<CollectionViewSource x:Key="testViewSource" d:DesignSource="{d:DesignInstance my:Test, CreateList=true}" />
</Window.Resources>
<Grid DataContext="{StaticResource testViewSource}">
<Button Content="{Binding Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="158,95,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对 PropertyChangedEventArgs 构造函数的调用中 Text 周围的引号丢失:
The quotes around Text in the call to the PropertyChangedEventArgs constructor are missing:
PropertyChanged
想要查看已更改的属性的名称而不是值。将事件调用更改为:它将完成工作。
不过,我也会将构造更改为
,然后不要从开始和结束调用 PropertyChanged 事件。
更进一步,创建如下调用方法:
然后从属性设置器中调用它们。
PropertyChanged
wants to see the name of the property that has changed and not the value. Change the event invocation to:and it will do the job.
However I also would change the construction to
and then dont call the PropertyChanged-event from Start and End.
And to go even a step further, create invocation-methods like:
and then call them from your property-setter.
首先,我使用了objectdataproviding,但它不是对象“ttt”,它们是两个不同的东西。
其次,PropertyChanged(this,new PropertyChangedEventArgs("Text"));“Text”是名称而不是变量。
因此,代码如下,可能对其他人有帮助。
数据类:
逻辑 cs:
xaml:
First of all, I used objectdataproviding, but it is not the object "ttt", they are two different things.
Second,
PropertyChanged(this,new PropertyChangedEventArgs("Text"));
"Text" is the name not the variable.So, the code is following, may be helpful to others.
The data class:
The logical cs:
The xaml:
您需要在属性周围使用引号:
我建议使用 nameof() 方法,因为当属性位于引号之间时,您无法重命名该属性:
You need to use quotes around the property:
I suggest to rather use the nameof()-method as you cannot rename the property while it's located between quotes: