2010-08-17 38 views
8

Tôi có chế độ xem thực hiện INotifyPropertyChanged. Trên chế độ xem nàyMô hình là thuộc tính được gọi là SubGroupingView. Thuộc tính này được gắn với mục được chọn của một hộp tổ hợp. Khi tôi thay đổi hộp kết hợp, thuộc tính nguồn đang được cập nhật tốt, nhưng khi tôi thay đổi thuộc tính nguồn hoặc khi điều khiển được khởi tạo, thì combobox.selectedItem KHÔNG phản ánh những gì tồn tại trong thuộc tính.
Dưới đây là một số mã để giúp bạn bắt đầu:Combobox SelectedItem không cập nhật khi thay đổi nguồn

<ComboBox Grid.Column="3" Grid.Row="1" 
      Margin="0,1,4,1" 
      SelectedItem="{Binding Path=SubGroupingView, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}" 
      ItemsSource="{Binding Columns}" 
      DisplayMemberPath="DisplayName"> 

Khu nghỉ dưỡng làm tăng sự kiện PropertyChanged và đầu ra TraceSource cho tôi thấy rằng các ràng buộc phát hiện nó và chuyển giao các giá trị, nó chỉ là combobox không phản ánh nó . Mọi ý tưởng sẽ được chào đón nhiều nhất!

EDIT:
đầu ra từ nguồn dấu vết là thế này:

System.Windows.Data Warning: 91 : BindingExpression (hash=23631369): Got PropertyChanged event from ReportViewModel (hash=52844413) 
System.Windows.Data Warning: 97 : BindingExpression (hash=23631369): GetValue at level 0 from ReportViewModel (hash=52844413) using RuntimePropertyInfo(SubGroupingView):   DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 76 : BindingExpression (hash=23631369): TransferValue - got raw value DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 80 : BindingExpression (hash=23631369): TransferValue - implicit converter produced DataColumnViewModel (hash=58231222) 
System.Windows.Data Warning: 85 : BindingExpression (hash=23631369): TransferValue - using final value DataColumnViewModel (hash=58231222) 

Đây là mã cho các tài sản nguồn:

public class ReportViewModel : ViewModelBase, IReportTemplate 
{ 
    public DataColumnViewModel SubGroupingView 
    { 
     get 
     { 
      return GetViewModel(_report.SubGrouping); 
     } 
     set 
     { 
      if (_report.SubGrouping == value.ColumnName) 
       return; 
      _report.SubGrouping = value.ColumnName; 
      RefreshDataSeries(); 
      base.OnPropertyChanged("SubGroupingView"); 
      base.OnPropertyChanged("IsReady"); 
     } 

    } 
} 

Lưu ý: ViewModelBase thực hiện INotifyPropertyChange.

ĐÁP
Tôi quá tải ==,! = Nhà khai thác, GetHashCode(), và Equals(object) và bây giờ nó đang làm việc độc đáo. Cảm ơn tất cả sự giúp đỡ của bạn!

+0

Không quan tâm, hãy thử đặt ItemsSource trước SelectedItem trong khai báo XAML của bạn ở đó. –

+0

R u rình rập tôi mờ? không có may mắn có – TerrorAustralis

+0

Thú vị ... bạn có thể có thể đăng một đoạn của ViewModel của bạn (cụ thể là định nghĩa của SubGroupingView)? – Pwninstein

Trả lời

15

Đối tượng được trả về từ SubGroupingView của bạn phải là "bằng" đối với một trong các đối tượng trong ComboBox.Items (có nghĩa là nó phải nằm trong bộ sưu tập Cột của bạn). Vì vậy, nếu bạn thực hiện một "a.Equals (b)", nó sẽ cần phải trả về true.

Nếu chúng có chức năng giống nhau, nhưng không trả lại đúng khi so sánh thì đó là vấn đề của bạn. Bạn sẽ cần trả về cùng một đối tượng hoặc ghi đè phương thức Equals (và có khả năng là toán tử == và! =).

Nếu đây là vấn đề của bạn, vấn đề tương tự như trong số question này.

+0

WELL trị giá tiền thưởng! Tôi muốn bỏ phiếu bạn lên hơn nữa nếu tôi có thể! Những gì tác động này có cho MVVM? nên tất cả các VMVM VMs thực hiện một so sánh trên lớp cơ sở? (không thể thưởng bounty cho một ba giờ tho) – TerrorAustralis

+0

Thật khó để nói dứt khoát, vì mọi tình huống đều khác nhau. Nếu bạn là ViewMod el không được sử dụng trong ItemsControls, sau đó nó có thể không quan trọng nếu bạn ghi đè bằng. Nhưng bạn sẽ chạy vào cùng một sitution nếu bạn đã thực hiện một danh sách đơn giản .Contains (something). Vì Contains đang thực hiện kiểm tra bình đẳng. – CodeNaked

3

Có phải IsSynchronizedWithCurrentItem trên ComboBox có thể được đặt thành false? Bạn có thể thử đặt rõ ràng IsSynchronizedWithCurrentItem="True" và xem điều đó có hữu ích không.

+0

Cảm ơn bạn đời, nhưng không may mắn, Nếu tôi đặt IsSynchronizedWithCurrentItem, nó không cháy của setter trên nguồn – TerrorAustralis

+1

Điều này đã giúp tôi khi cập nhật – Dave

+0

Nếu tôi đặt nó, tôi nhận được "Không thể gán cho tài sản" Windows.UI.Xaml.Controls.Primitives.Selector.IsSynchronizedWithCurrentItem '. "trong khi khởi tạo (Đây là một ứng dụng UWP, tài sản đã được đề xuất bởi Intellisense, do đó, nó tồn tại) –

0

Câu trả lời của @CodeNaked là đúng. Nhưng trong trường hợp của tôi chỉ cần ghi đè Object.Equals ném StackOverflowException. Tôi nghĩ rằng toàn bộ câu trả lời là thực hiện đầy đủ IEquatable có nghĩa là thực hiện phương thức Equals và ghi đè các đối tượng Object.Equals (Object) và Object.GetHashCode như trong this example (xem phần cuối của phần "Ghi chú" - "Ghi chú cho người thực hiện" - và " Ví dụ "phần".

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