В C # и WPF, вы можете связать элемент массива со свойством объектов? - PullRequest
8 голосов
/ 23 октября 2010

Например, возможно ли привязать свойство Text для текстового блока к элементу Name [2] типа String?

Ответы [ 5 ]

12 голосов
/ 23 октября 2010

Я не уверен, что именно вы имеете в виду, говоря: имя элемента [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>

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

4 голосов
/ 23 октября 2010

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

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}"/>
3 голосов
/ 25 октября 2010

Я добавил кнопку в 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"));
    }
}
1 голос
/ 19 мая 2015

Вместо этого используйте 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>
1 голос
/ 23 октября 2010

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

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