2014-09-03 67 views
1

我有兩個DataGrids填充了相同類型的對象的單獨集合。在我的ViewModel中,我有一個屬性「CurrentObject」,我想綁定到當前選定的對象。如何將單個屬性綁定到WPF中兩個控件的選擇?

這意味着,如果我選擇數據網格甲連續CurrentObject持有數據網格中的選擇的項目和,如果我選擇一行在數據網格B中的CurrentObject保持數據網格B.

在兩個所選擇的項目DataGrid中我已經做了這樣的結合:

<DataGrid SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentObject}"> 

它只有當我改變一個在DataGrid中選擇按預期工作。如果我選擇一個已經選擇的行,CurrentObject屬性不會更新,並且仍然引用另一個DataGrid中的對象。我想這是因爲SelectionChanged事件沒有被觸發,然後

+0

你看着MultiBinding HTTP的焦點: //msdn.microsoft.com/en-us/library/system.windows.data.multibinding%28v=vs.110%29.aspx – Gishu 2014-09-03 05:34:27

+2

不是MultiBinding用於將多個屬性綁定到單個控件。我需要它反之亦然。請告訴我,如果我錯了;-) – mamuesstack 2014-09-03 05:39:58

+0

你的意思只有當您將DataGridA中的selecteditem更改爲DataGridB時,CurrentObject纔會更改?在一個DataGrid中更改selecteditem時它不會更改? – Rang 2014-09-03 06:05:43

回答

0

穰也有主意,用互動觸發器以防止後面的代碼。看起來我們在同一時間有同樣的想法。他的方法是在額外的視圖模型方法中處理LostFocus事件,我的方法是使用綁定來處理GotFocus。我認爲這是個人喜好的方式。爲了完整起見:

<iy:Interaction.Triggers> 
    <iy:EventTrigger EventName="GotFocus"> 
     <is:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext}" 
           PropertyName="CurrentObject" 
           Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=SelectedValue}" /> 
    </iy:EventTrigger> 
</iy:Interaction.Triggers> 

由於綁定時,選擇一個單一的控制之內改變時,才更新,我還更改屬性在DataGrid得到

+0

我收到了downvote。請告訴我我的答案有什麼問題,因爲我仍然最喜歡我的最愛 – mamuesstack 2014-09-03 08:29:38

0

我不能清楚地告訴你是否使用事件或綁定,但我會假設你以綁定的方式來做。在這種情況下,請嘗試將IsSynchronizedWithCurrentItem設置爲true。更多信息here

+0

是的,我做綁定的方式。我已經使用同步,不適用於我 – mamuesstack 2014-09-03 06:17:41

+0

在這種情況下,你不需要任何觸發器或其他任何東西,真的。只需按照我的答案中的鏈接,你會看到WPF自己管理雙重選擇... – 2014-09-03 06:35:27

+0

塞巴斯蒂安,我明白你的觀點。但由於ItemsSource是兩個獨立的集合,所以同步無法工作,可以嗎? – mamuesstack 2014-09-03 07:08:39

2

清除的SelectedItem DataGrid中的LostFocus事件:

例如:

private void dg1_LostFocus(object sender, RoutedEventArgs e) 
{ 
     dg1.SelectedItem = null; 
} 

private void dg2_LostFocus(object sender, RoutedEventArgs e) 
{ 
     dg2.SelectedItem = null; 
} 

,因爲如果你不明確的SelectedItem在DataGrid引發LostFocus,DataGrid中仍然會記得的SelectedItem,如果你再次選擇此項目,SelectionChanged事件不會觸發。

MVVM例如:

public void dg1_LostFocus(object sender, RoutedEventArgs e) 
    { 
     DataGrid dg = sender as DataGrid; 
     if(dg != null) 
     { 
      dg.SelectedItem = null; 
     } 

    } 

    <i:Interaction.Triggers> 
      <i:EventTrigger EventName="LostFocus"> 
       <ei:CallMethodAction MethodName="dg1_LostFocus" TargetObject="{Binding}" /> 
      </i:EventTrigger> 
    </i:Interaction.Triggers> 
+0

嗯,我試圖嚴格避免代碼背後,但你讓我想着處理重點改變事件 – mamuesstack 2014-09-03 06:21:02

+1

你可以避免代碼隱藏,使用'我:互動ei: CallMethodAction'或其他,而不是使用mvvm。 – Rang 2014-09-03 06:26:33

+0

看起來我們兩人在同一時間有同樣的想法;-) – mamuesstack 2014-09-03 06:34:53

相關問題