从公共类访问标签

时间:2015-10-27 20:16:46

标签: c# wpf

我很好奇,最好的做法是从与标签位于同一名称空间和窗口内的类操作标签属性。

示例代码:

public function assignRole($role,$id) { 
    $auth = Yii::app()->authManager;
    $items = $auth->getRoles($id);
    foreach ($items as $item) {
        $auth->revoke($item->name, $id);
    } 
    // assign new role to the user 
    $auth->assign($role, $id);
    $auth->save();
}

我如何引用labelController的setText函数中的标签或任何工具箱项?

1 个答案:

答案 0 :(得分:0)

1.操纵标签或任何其他UI Elements属性的最佳方法是在WPF中使用数据绑定或MVVM模式。

例如,您可以将标签属性数据绑定到类后面的代码中的某些成员属性(即Window类),如下所示:

    <Label Content="{Binding LabelContent}" />

其中LabelContent是您的代码后面的成员,如下所示:

 private string _LabelContent;
    public string LabelContent
    {
        get { return _LabelContent; }
        set
        {
            _LabelContent= value;
            RaisePropertyChangedEvent("LabelContent");
        }
    }

或者您可以在代码隐藏类以外的其他类(视图模型)中操作标签属性,并在Window codebehind中设置datacontext以指向视图模型类,如下所示:

 public class ViewModel : INotiFyPropertyChanged
{
    private string _LabelContent;
    public string LabelContent
    {
        get { return _LabelContent; }
        set
        {
            _LabelContent= value;
            RaisePropertyChangedEvent("LabelContent");
        }
        }
   }

 //setting datacontext is crucial in MVVM
 public partial class MainWindow : Window
{
    public ViewModel vm;

    public MainWindow ()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
 }

请记住,在这两种情况下,您都需要在Window类和视图模型类上实现INotifyPropertyChanged接口。

INOtify的主要目的是将数据推送到UI中,无论何时数据在代码隐藏或viewmodel类中发生变化,反之亦然(即,UI中的变化,如某些TextBox)。 这样,您就不必从代码隐藏/视图模型中明确地将数据拉入或推送到UI中。

例如,您的ButtonClick方法可以更改如下:

 private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        LabelContent = "Cows Go Moo!";
    }

由于LabelContent绑定到XAML文件中的Label Text属性,因此只要执行ButtonClick方法,UI就会自动更改Label Text。

INOtify的PFB代码...界面:

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChangedEvent(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            this.PropertyChanged(this, e);
        }
    }

您可以在MSDN网站上找到MVVM,WPF数据绑定以及INotify ..接口的详细信息。

  1. 如果要根据另一个属性(如Content)更改标签的属性,请使用实现IConverter接口的类根据其他属性动态更改属性。例如,

    public class StringToColorConverter: IValueConverter
    {
    
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
     string contentvalue=value.ToString();
        var result = (contentvalue.Equals("something")) ? Brushes.Green : Brushes.Red;
        return result;
    }
    
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    
    
    }
    
  2. 您可以使用转换器根据xaml中的内容属性更改背景属性,如下所示:

                   <Window.Resources>
                    <StringToColorConverter x:key="stringtocolorconverter"/>
                      </Window.Resources>
    
             <Label content="{Binding LabelContent}" Background="{Binding LabelContent, Converter={StaticResource stringtocolorconverter}}" />
    

    或使用标签的内容属性为标签命名并转换背景属性,如下所示:

             <Label Name="LabelElement" content="{Binding LabelContent}" Background="{Binding Path=content, ElementName="LabelElement",Converter={StaticResource stringtocolorconverter}}" />