簡體   English   中英

具有多個控件的WPF數據綁定

[英]WPF Data Binding with multiple controls

在WPF中,我試圖綁定多個控件,但是當第一個控件更改時,第二個控件沒有更改。

我有兩個類:Task類和Log類,它們作為一個集合存儲在Task類中。 下面的列表框綁定到任務以及所選任務的內部日志。

問題在於,列表框在第一次加載時就可以很好地填充,但是如果我選擇其他任務,我希望日志將更新為新任務的集合,但與原始任務相比不會發生變化首次加載時選擇的任務。 我想念什么?

在設計器中:

    <ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
             Grid.Row="0" Grid.Column="0" Grid.RowSpan="2">
    </ListBox>
    <ListBox x:Name="listBoxLogs" 
             ItemsSource="{Binding Logs}" DisplayMemberPath="EntryDate"
             Grid.Row="1" Grid.Column="1">
    </ListBox>

在后面的代碼中:

public MainWindow()
        {
            InitializeComponent();

            IMongoCollection<Task> tasks = DataManager.GetData();

            this.DataContext = tasks.AsQueryable();
        }

Task類:

public class Task : BusinessBase<Task>
{
    public ObjectId _Id { get; set; }
    public string Key { get; set; }
    public string Description { get; set; }
    public string Summary { get; set; }
    public string Details { get; set; }

    public IEnumerable<Log> Logs { get; set; }
    public IEnumerable<Link> Links { get; set; }
    public IEnumerable<String> RelatedKeys { get; set; }
    public IEnumerable<TaskItem> Items { get; set; }
}

您的Task類需要實現INotifyPropertyChanged接口,以便一旦基礎數據發生任何變化,它就可以告訴WPF UI某些更改現在可以再次更新/刷新控件。

您的任務類需要實現INotifyPropertyChanged

http://msdn.microsoft.com/en-us/library/ms743695.aspx

您必須將第一個ListBox SelectedItem綁定到Task模型的對象,並為SelectionChanged添加事件處理程序。 在此事件內,您必須通過選定的Task模型填充日志,還必須在類中實現INotifyPropertyChanged

在我看來,第二個綁定根本不起作用,因為DataContextTasks的可枚舉對象,而該可枚舉對象本身沒有稱為Logs屬性。 您可以嘗試使用IsSynchronizedWithCurrentItem以及對當前項目的綁定:

<ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
         Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"
         IsSynchronizedWithCurrentItem="True"> <!-- Set this -->
</ListBox>
<ListBox x:Name="listBoxLogs" DisplayMemberPath="EntryDate"
         Grid.Row="1" Grid.Column="1"
         ItemsSource="{Binding /Logs}"> <!-- Note the slash which indicates a binding to the current item -->
</ListBox>

您還可以綁定到另一個ListBoxSelectedItem ,但這在控件之間引入了冗余依賴關系。 還要注意,如果更改數據對象中的任何屬性,則需要實現其他應答者INotifyPropertyChanged提到的接口。

我已經全部工作了。 我實現了INotifyPropertyChanged,盡管那不能解決問題。

我現在正在使用MVVM模式。 這有幫助...我正在使用的NoRM庫沒有SelectionChanged事件。 我創建了一個視圖模型,並能夠將這些模型轉換為ObservableCollections。 現在,我只是在為Task類更改選擇時設置Logs控件DataContext。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM