簡體   English   中英

從公共類訪問標簽

[英]Accessing a label from a public class

我很好奇從與標簽位於相同名稱空間和窗口的類中操作標簽屬性的最佳實踐是什么。

示例代碼:

namespace SampleApplication1
{
    public partial class MainWindow : Window
    {
        public class labelController
        {
            public void setText()
            {
                //How do I reference label1 from here properly/in best practice to modify it's content?
            }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        labelController lblCtrl = new labelController();

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

我將如何從 labelController 的 setText 函數中引用標簽或任何工具箱項目?

1. 操作標簽或任何其他 UI 元素屬性的最佳方法是將數據綁定或 MVVM 模式與 WPF 結合使用。

例如,您可以將標簽屬性數據綁定到類(即 Window 類)后面的代碼中的某些成員屬性,如下所示:

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

其中 LabelContent 是您的類代碼中的成員,如下所示:

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

或者,您可以在代碼隱藏類之外的不同類(視圖模型)中操作標簽屬性,並在窗口代碼隱藏中設置數據上下文以指向視圖模型類,如下所示:

 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 中,無論何時代碼隱藏或視圖模型類中的數據發生變化,反之亦然(即,UI 中的更改,如某些 TextBox)。 這樣,您就不必從代碼隱藏/視圖模型中顯式地將數據拉入或推送到 UI 中。

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

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

由於 LabelContent 綁定到 XAML 文件中的 Label Text 屬性,因此只要執行 ButtonClick 方法,UI 就會自動更改標簽文本。

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(); } }

您可以使用轉換器根據 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}}" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM