将 INT 转换为多个 WPF 可见性的复杂绑定
本文关键字:可见性 复杂 绑定 WPF INT 转换 | 更新日期: 2023-09-27 18:31:48
好的,让我们看看我做得对,还是我做得很艰难。
第一。我有一个帐户级别,每个 Byte 设置为启用给定函数的整数 (0-255)。我正在努力设置给定字节的可见性Psudo XML 代码
<Button Grid.Column="0" Grid.Row="0" Name="Function" Content="Function 1" Visibility="{Binding UserLevel.Allow1 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="1" Name="Function" Content="Function 2" Visibility="{Binding UserLevel.Allow2 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="2" Name="Function" Content="Function 3" Visibility="{Binding UserLevel.Allow3 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="3" Name="Function" Content="Function 4" Visibility="{Binding UserLevel.Allow4 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="4" Name="Function" Content="Function 5" Visibility="{Binding UserLevel.Allow5 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="5" Name="Function" Content="Function 6" Visibility="{Binding UserLevel.Allow6 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="6" Name="Function" Content="Function 7" Visibility="{Binding UserLevel.Allow7 , UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="0" Grid.Row="7" Name="Function" Content="Function 8" Visibility="{Binding UserLevel.Allow8 , UpdateSourceTrigger=PropertyChanged}"/>
当用户登录时,类ProgramVar.ActiveUser被拉取并设置为当前登录的用户从PHP肥皂接口(工作)
class ProgramVar : INotifyPropertyChanged
{
private User _ActiveUser;
private Level _UserLevel;
public User ActiveUser { get { return this._ActiveUser; } set { _ActiveUser= value; UpdateLevel(); NotifyPropertyChanged("ActiveUser "); } }
public Level UserLevel { get { return this._UserLevel; } set { _UserLevel= value; NotifyPropertyChanged("UserLevel"); } }
private void UpdateLevel()
{
UserLevel.Allow1 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 1) UserLevel.Allow1 = Visibility.Visible;
UserLevel.Allow2 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 2) UserLevel.Allow2 = Visibility.Visible;
UserLevel.Allow3 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 4) UserLevel.Allow3 = Visibility.Visible;
UserLevel.Allow4 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 8) UserLevel.Allow4 = Visibility.Visible;
UserLevel.Allow5 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 16) UserLevel.Allow5 = Visibility.Visible;
UserLevel.Allow6 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 32) UserLevel.Allow6 = Visibility.Visible;
UserLevel.Allow7 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 64) UserLevel.Allow7 = Visibility.Visible;
UserLevel.Allow8 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 128) UserLevel.Allow8 = Visibility.Visible;
NotifyPropertyChanged("UserLevel");
}
}
class User
{
string UserName;
string FirstName;
int AccountLevel;
}
class Level
{
Visibility Allow1 = Visibility.Visible;
Visibility Allow2 = Visibility.Visible;
Visibility Allow3 = Visibility.Visible;
Visibility Allow4 = Visibility.Visible;
Visibility Allow5 = Visibility.Visible;
Visibility Allow6 = Visibility.Visible;
Visibility Allow7 = Visibility.Visible;
Visibility Allow8 = Visibility.Visible;
}
现在我也在阅读有关 IValueConverters 的信息,使用当前的方法是正确的方法,还是应该在 XAML 和 CS 文件中使用 IValueConverts?
我正在使用的当前方法正在工作,因为当我尝试使用 IValueConvertes 时,我没有看到如何让对象返回多个 Visibilities(或如果需要的其他变量)
你做错了几件事...
- 您的
Level.AllowX
是字段而不是属性。WPF 希望属性参与绑定。
将它们 - 转换为属性后,
AllowX
资源库应引发属性更改通知(就像在ProgramVar.UserLevel
中一样)。 - 你的
NotifyPropertyChanged("ActiveUser ")
有一个尾随空间!它应该是NotifyPropertyChanged("ActiveUser")
. - 由于您已经在设置
Visibility
枚举值,因此我认为您的绑定中不需要值转换器。 - 尽管最终创建 255 个
AllowLevel
字段是个坏主意!请检查ItemsControls
和ItemsSource
如何使用List<Visibility>
值!