首页 / C# / c# – WPF绑定依赖属性
c# – WPF绑定依赖属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – WPF绑定依赖属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5036字,纯文字阅读大概需要8分钟。
内容图文
![c# – WPF绑定依赖属性](/upload/InfoBanner/zyjiaocheng/792/0377d3eeb81147afb1e5a25f13ff8996.jpg)
我在UserControl中绑定依赖项属性时遇到问题.初始化时,它获取一个值,但不会更新.我可能错过了一些明显的东西,这里有一些代码片段:
这是我绑定BalanceContent依赖项属性的地方:
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4"
BalanceContent="{Binding Source={StaticResource UserData}, Path=SelectedUser.Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</Game:PlayerDetails>
这是UserControl中的TextBox:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2"
Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}, Path=BalanceContent}"
Grid.Row="7"></TextBox>
这是依赖属性:
public static readonly DependencyProperty BalanceContentProperty = DependencyProperty.Register(
"BalanceContent", typeof(string), typeof(PlayerDetails));
public string BalanceContent
{
get
{return (string) GetValue(BalanceContentProperty);}
set
{SetValue(BalanceContentProperty, value);}
}
以下是更新所选用户的列表,该列表位于使用UserControl的视图中:
<ListView x:Name="lstAccounts" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="4"
ItemsSource="{Binding Source={StaticResource UserData}, Path=CurrentUserSearch}"
SelectedItem="{Binding Source={StaticResource UserData}, Path=SelectedUser}"
这里定义了SelectedUser,它实现了一个实现INotifyPropertyChanged的类:
public User SelectedUser
{
get
{
return _selectedUser;
}
set
{
_selectedUser = value;
OnPropertyChanged(new PropertyChangedEventArgs("SelectedUser"));
}
}
我们的想法是,当在列表中选择新用户时,TextBox应该更新,但此时它不会这样做.我已将绑定放在本地TextBox上并且它更新正常,而不是在DependencyProperty上.任何帮助赞赏.
解决方法:
您可以尝试一些可能性:
首先,ListView可能不会更新ViewModel的SelectedUser属性.尝试将ListView中的绑定设置为“TwoWay”模式:
<ListView x:Name="lstAccounts" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="4"
ItemsSource="{Binding Source={StaticResource UserData}, Path=CurrentUserSearch}"
SelectedItem="{Binding Source={StaticResource UserData}, Path=SelectedUser, Mode=TwoWay}"/>
您可以更好地组织DataContext的定义方式.请记住,UserControl的所有子控件都可以访问其DataContext而无需使用相对绑定(它们继承它).由于您的PlayerInfo控件依赖于SelectedUser,请考虑将其DataContext设置为SelectedUser,将其绑定到ListView的SelectedUser或UserData视图模型中的SelectedUser.
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{Binding Source={StaticResource UserData}, Path=SelectedUser}"
BalanceContent="{Binding Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</Game:PlayerDetails>
当前SelectedUser的源也可以是ListView:
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{Binding SelectedItem, ElementName=lstAccounts}"
BalanceContent="{Binding Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</Game:PlayerDetails>
无论哪种方式,您都可以在TextBox上执行以下操作,因为它的DataContext将与其父级相同:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2"
Text="{Binding Balance}"
Grid.Row="7"></TextBox>
如果usercontrol依赖于命令和其他高级逻辑之类的根视图模型,则以可以轻松访问SelectedUser的方式将DataContext设置为它.
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4" DataContext="{StaticResource UserData}"
BalanceContent="{Binding SelectedUser.Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</Game:PlayerDetails>
所以你可以这样做:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2"
Text="{Binding SelectedUser.Balance}"
Grid.Row="7"></TextBox>
然而,在第二种方法中,你必须检查一件我不确定的事情.我知道当控件的DataContext发生更改时,它会更新所有依赖绑定.例如,如果您将PlayerDetails DataContext更改为另一个UserData实例,则BalanceContent属性也会更新.但是,在这种情况下,BalanceContent取决于UserData的SelectedUser的属性.所以它会监听User实例的Property更改.如果SelectedUser.Balance更改(并且User实现了INotifyPropertyChanged,或者它是DependencyProperty),则BalanceContent将更新.现在,如果UserData中的SelectedUser实例发生更改,我不确定BalanceContent是否会更新,因为我认为绑定不会侦听其路径中每个对象的更改.
编辑
最后一点可能是我在使用xaml开发时遇到的第一个问题.我在Silverlight中有一个DataGrid,其实体类型具有复杂类型的属性.其中一列取决于复杂类型的属性.如果我更改了复杂类型的值,该列将更新正常(它实现了INPC).如果我更改了实体的复杂类型实例,则该列不会…解决方案是级联DataContexts:我创建了一个模板列,为复杂类型设置了列的绑定,而不是其属性.然后我将模板的TextBox文本绑定到complextype的属性,因为它现在是TextBox的DataContext.
在您的情况下,您可以为TextBox.Text执行此操作,但不能为PlayerDetails.BalanceContent执行此操作.您可以将TextBox.DataContext绑定到UserData的SelectedUser,然后将Text绑定到Balance属性.
<TextBox VerticalAlignment="Center" DataContext="{Binding SelectedUser}" FontFamily="Formata" FontSize="20" Grid.Column="2"
Text="{Binding Balance}"
Grid.Row="7"></TextBox>
内容总结
以上是互联网集市为您收集整理的c# – WPF绑定依赖属性全部内容,希望文章能够帮你解决c# – WPF绑定依赖属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。