【问题标题】:Complicated Binding converting INT to Multiple WPF Visibility将 INT 转换为多个 WPF 可见性的复杂绑定
【发布时间】:2012-05-01 15:45:33
【问题描述】:

好的,让我们看看我这样做是否正确,还是我做得很艰难。

首先。 我有一个整数(0-255)的帐户级别,每个字节都设置为启用给定的功能。 我正在设置对给定字节的可见性 伪 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 Soap 接口(工作)中拉出并设置为当前登录的用户

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?

我正在使用的 Current 方法正在运行,因为当我尝试使用 IValueConvertes 时,我没有看到如何让一个对象返回多个 Visibilities(或其他变量,如果需要)

【问题讨论】:

  • 如果你的实现是有效的,我想使用 IValueConverters 不是一个好主意,因为它会让你的事情变得复杂。你可以坚持这个实现。我宁愿使用 List 或 ObservableCollection of Visibility 作为类型,并像 visibilityCollection [index] 一样使用它。当控件或代码段的可见性取决于另一个控件(如单选按钮或复选框)的值或者可能是其他一些简单逻辑时,通常使用 IValueConverters。
  • 你很难用你的逻辑来实现这个,因为 ActiveUSer AccountLevel 也被考虑在内,你需要在你的 ViewModel 中编写转换器,而不是在你的 ViewModel 逻辑中编写单独的转换器类在可见性转换中。

标签: c# wpf binding visibility ivalueconverter


【解决方案1】:

你做错了一些事情......

  1. 您的Level.AllowX 是字段而不是属性。 WPF 期望属性参与绑定。
  2. 将它们转换为属性后,AllowX 设置器应该引发 PropertyChangedNotifications(就像在 ProgramVar.UserLevel 中一样)。
  3. 您的NotifyPropertyChanged("ActiveUser ") 有一个尾随空格!应该是NotifyPropertyChanged("ActiveUser")
  4. 由于您已经在设置Visibility 枚举值,所以我认为您的绑定中不需要值转换器。
  5. 虽然最终创建 255 个AllowLevel 字段是个坏主意!请检查 ItemsControlsItemsSource 如何与 List&lt;Visibility&gt; 值一起使用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2013-06-26
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2018-12-28
    • 2014-01-25
    • 2018-10-13
    相关资源
    最近更新 更多