2015-05-20 16 views
6

Tôi đang cố gắng chuyển/áp dụng ứng dụng Windows RT của mình cho WIndows10 và tôi đang thử kết nối mới x: Bind.Windows 10 x: Liên kết với SelectedItem

Cho đến nay tôi có thể liên kết với các thuộc tính ViewModel của mình và các Chế độ xem khác. Nhưng bây giờ tôi đang cố gắng để ràng buộc các văn bản của một TextBox đến một SelectedItem của một GridView.

Trong ràng buộc cổ điển, tôi đang làm như vậy.

<TextBox x:Name="tb_textgroup" 
          Grid.Row="1" 
          PlaceholderText="Change Groupname" 
          Text="{Binding UpdateSourceTrigger=PropertyChanged, 
            ElementName=gv_textgroup, 
            Mode=TwoWay,Path=SelectedItem.bezeich}" 
          IsEnabled="{Binding UpdateSourceTrigger=PropertyChanged, 
             ElementName=gv_textgroup, 
             Mode=TwoWay,Path=SelectedItem.edit_activated}" 
          Margin="20,10,20,0" 
          /> 

Tôi đã cố gắng nó với

  • Text = "{x: Bind gv_textgroup.SelectedItem.bezeich, Mode = TwoWay}"
  • Text = "{x: Bind textgroup [gv_textgroup. SelectedIndex] .bezeich, Mode = TwoWay}"
    • nơi textgroup là viewmodelclass tôi với tất cả các yếu tố

Nhưng không ai trong số đó hoạt động ... bất kỳ ý tưởng nào?

Và ai đó có thể giải thích cho tôi phải làm gì với "DependencyProperty". Tôi đã xem viedo từ "build 2015" và có mã mẫu. Nhưng nó không nói gì với tôi ... Tôi khá một newbie ...

Rất cám ơn sự giúp đỡ của bạn

Trả lời

3

Bạn không thể sử dụng x: Ràng buộc trên SelectedItem của một GridView. Điều này là do SelectedItem là một đối tượng, vì vậy nó có thể là bất cứ điều gì. x: Bind cần phải có các lớp/giao diện thực tế. x: Bind không sử dụng sự phản chiếu để tìm các thuộc tính như Binding.

Bạn có thể thực hiện điều này bằng cách x: Liên kết SelectedItem của GridView với mô hình khung nhìn của bạn và sau đó x: Ràng buộc với điều đó từ TextBlock. Tôi không chắc chắn điều này sẽ thực sự giúp hiệu suất nhiều như bạn muốn.

public class ViewModel 
{ 
    public MyItem SelectedItem { get; set; } //fire prop changed 
} 

<GridView SelectedItem="{x:Bind SelectedItem, mode=Twoway}"/> 
<TextBlock Text="{x:Bind ViewModel.SelectedItem.bezeich}" 
+0

Tôi sợ bạn nói đúng. Nhưng tôi nghĩ rằng điều này thực sự là một điều đáng tiếc mà bạn không thể chuyển từ đối tượng đến lớp học của bạn. Tôi hy vọng Microsoft sẽ cải thiện kỹ thuật đó khi họ đề cập đến việc xây dựng (Tôi đã từng đọc/nghe nó trong một Video). Cảm ơn thời gian của bạn – thezapper

+0

Làm thế nào họ có thể biết bạn muốn đối tượng là gì. x: Bind là một chỉ thị thời gian biên dịch. Điều đó có nghĩa là nó sẽ tạo mã tại thời gian biên dịch liên kết với đối tượng/thuộc tính của bạn. Bạn không thể mong đợi trình biên dịch biết rằng bạn muốn một đối tượng có kiểu MyObject. –

+0

Có lẽ một cái gì đó như thế này: thezapper

11

Tôi không chắc chắn lý do tại sao các công trình này, nhưng nếu bạn tạo một đối tượng để đối tượng chuyển đổi, x:Bind công trình để chuyển đổi hai chiều trên bất kỳ SelectedItem.

public class NoopConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 
} 

Và bạn có thể sử dụng nó như thế này:

<ListView ItemsSource="{x:Bind ViewModel.Items}" 
     SelectedItem="{x:Bind ViewModel.SelectedItem, Mode=TwoWay, Converter={StaticResource NoopConverter}}" 
     ... 

Đặc biệt cảm ơn runceel cho mẫu công khai của Người.

Ông giải thích nó here bằng tiếng Nhật.

+3

Nó hoạt động vì khi trình biên dịch thấy có một trình chuyển đổi cho ràng buộc, nó bỏ qua thực tế là có thể có xung đột kiểu và cho phép mã có nguy cơ ngoại lệ thời gian chạy. –

Các vấn đề liên quan