В C# и WPF можно ли привязать элемент массива к свойству objects?

например, можно ли привязать текстовое свойство Textblock к имени элемента [2] типа String?

5 ответов


Я не уверен, что вы имеете в виду, говоря:имя элемента[2] типа String, поэтому вот два возможных решения вашей проблемы: Array1 и String1. Array1 показывает лук для привязки к элементу массива, а String1 показывает, как отображать один символ в строке.

код:

 public partial class MainWindow : Window
{
    private Array array1 = new[] {"test1", "test2", "test3"};
    public Array Array1 { get { return array1; } }

    public string string1 = "string";
    public string String1 { get { return string1; } }

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

XAML:

 <StackPanel Orientation="Vertical">
    <TextBlock Text="{Binding Array1[0]}"/>
    <TextBlock Text="{Binding Array1[2]}"/>
    <TextBlock Text="{Binding String1[0]}"/>
    <TextBlock Text="{Binding String1[1]}"/>
</StackPanel>

надеюсь, что это поможет.


Да, вы можете. Ниже приведен подход XAML. Рекомендуется привязку к наблюдаемой коллекции, если вы хотите обновить UI автоматически при изменении значения.

public class DataStub
{
    public Array SomeNorthEasternStates
    {
        get
        {
            return new[] { "NH", "VT", "CT", "MA", "ME" };      
        }
    }
}

XAML: предполагая, что DataContext установлен правильно:

<TextBox Margin="5" Text="{Binding SomeNorthEasternStates[3], Mode=Default}"/>

Я добавил кнопку в xaml и подписался на событие "click".

вот код на C#.

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private Array array1 = new[] { "test1", "test2", "test3" };
    public Array Array1 { get { return array1; } }


    public string string1 = "string";
    public string String1
    {
        get { return string1; }
        set
        {
            string1 = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("String1"));
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        String1 = DateTime.Now.ToString();
        array1.SetValue("another test", 0); 
        PropertyChanged(this, new PropertyChangedEventArgs("Array1"));
    }
}

Если вы имеете в виду, что если мы можем связать элемент массива с textBox, то да

 <TextBox Margin="10" Text="{Binding Name[2], Mode=Default}"  Name="textBox1"/>

вместо этого используйте ObservableCollection:

private ObservableCollection<string> _myItems = new ObservableCollection<string>(new[] { "test1", "test2", "test3" });

public ObservableCollection<string> MyItems
{
    get { return _myItems; }
    set { _myItems = value; }
}

в XAML

    <StackPanel Orientation="Vertical">
        <TextBox Text="{Binding MyItems[0]}"/>
        <TextBox Text="{Binding MyItems[2]}"/>
        <TextBlock Text="{Binding MyItems[0]}"/>
        <TextBlock Text="{Binding MyItems[1]}"/>
    </StackPanel>