2010-10-23 16 views
7

Ví dụ: có thể liên kết thuộc tính Văn bản của Textblock với một phần tử Tên [2] của chuỗi kiểu không?Trong C# và WPF, bạn có thể liên kết một phần tử của một mảng với một thuộc tính đối tượng không?

+1

Bạn có nghĩa là làm thế nào để ràng buộc Tên [2] để sở hữu kiểm soát declaretively trong XAML? –

+0

Vâng đó là ý tôi. Ngay bây giờ, mặc dù, các ràng buộc đang làm việc nhưng kiểm soát mục tiêu không được cập nhật khi biến nguồn được thay đổi. Tôi đang bối rối – Scifiballer24

Trả lời

12

Tôi không chắc chắn những gì bạn có nghĩa là chính xác bằng cách nói: một Tên yếu tố [2] của kiểu String, vì vậy đây là hai giải pháp có thể cho vấn đề của bạn: Array1 và String1. Mảng 1 hiển thị cung để liên kết với phần tử của một mảng và String1 hiển thị cách hiển thị một ký tự đơn trong một chuỗi.

Mã sản phẩm:

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> 

Hy vọng rằng sẽ giúp.

+0

Cảm ơn, công trình này ngoại trừ việc cập nhật nguồn không cập nhật điều khiển đích. Tôi đã thử tất cả mọi thứ và nó không hoạt động cho đến nay. Tôi có nên sử dụng ObservableCollection không? – Scifiballer24

+0

Vì nhận xét này không cho phép tôi đăng câu trả lời khác. –

1

nếu bạn có nghĩa là nếu chúng ta có thể ràng buộc mục mảng với textbox sau đó, vâng

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

TextBox không có thuộc tính Nội dung. –

+0

xin lỗi ... sai lầm của nó, cảm ơn – Azhar

4

Có bạn có thể. Sau đây là cách tiếp cận XAML. Bạn nên liên kết với bộ sưu tập có thể quan sát nếu bạn muốn tự động cập nhật giao diện người dùng khi giá trị thay đổi.

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

XAML: Giả sử các DataContext được thiết lập một cách chính xác:

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

Có lý do cụ thể nào khiến bạn sử dụng các phương thức của lớp 'Array' thay vì chỉ đơn giản là' var testArray = new string [5]; testarray [0] = "NY"; ... '. – Heinzi

+1

@Heinzi - Hoặc var testArray = new [] {"NH", "VT", "CT", "MA", "ME"}; (NY và NJ không ở New England) :) –

+0

@ John Bowen. Lỗi của tôi. Đã đổi tên. – SKG

3

Tôi đã thêm nút trong xaml và sự kiện "nhấp" đã đăng ký.

Đây là mã 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")); 
    } 
} 
+0

Cảm ơn. ObservableCollection cũng thực hiện các tính năng đó và hoạt động hoàn hảo. Tôi đánh giá cao sự giúp đỡ của bạn klm_. – Scifiballer24

1

Sử dụng ObservableCollection thay vì:

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> 
Các vấn đề liên quan