2013-09-14 4 views
1

Dears, У меня есть столбец combobox в datagrid, привязанный к наблюдаемой коллекции. Рынки в моей модели ViewModel, в то время как DataGrid привязан к коллекции ClientMarketCode, которая представляет собой коллекцию в объекте NewClient. ClientMarketCode имеет следующие свойства: Code, MarketCodeTypeID, MarketID. поэтому я использовал combobox, привязанный к Markets, в случае, если пользователь хотел редактировать Market, он показывает все рынки и пользователь выбирает рынок, который он хочет. У меня есть проблема при выборе любого другого рынка, так как значение рынка в выбранной строке не изменилось после выбирая новый рынок из combobox.изменение выбранного значения Combobox в DataGrid wpf

.: например

позволяет говорить о том, что первая строка имеет KSA рынок, то я изменил его из выпадающего списка в США после нажатия на США он возвращает Baco к KSA я не знаю у.

Вот мой взгляд модель:

public class MarketsViewModel : ObservableObject, IMarketsViewModel, INavigationAware, IConfirmNavigationRequest, IRegionMemberLifetime 
{ 
    #region MarketsViewModel 
    public MarketsViewModel() 
    { 
     this.GetMarkets(); 
    } 
    public ObservableCollection<Market> Markets 
    { 
     get { return m_Market; } 
     set 
     { 
      m_Market = value; 
      RaisePropertyChanged("Markets"); 
     } 
    } 

    private void GetMarkets() 
    { 
     try 
     { 
      Market[] MarketArr; 

      using (var client = new ClientServiceProxy()) 
      { 
       MarketArr = client.GetAllMarkets(); 
      } 
      if (MarketArr != null) 
      { 
       this.Markets = new ObservableCollection<Market>(MarketArr); 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message); 
     } 
    } 
} 

Херес XAML:

<Custom:C1DataGrid x:Name="c1DataGrid" 
        AutoGenerateColumns="False" 

        Height="490" ItemsSource="{Binding Path=NewClient.ClientMarketCodes,Mode=TwoWay,UpdateSourceTrigger=LostFocus,ValidatesOnDataErrors=True,ValidatesOnExceptions=True}"> 
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#FFBEBE00" Offset="0.5"/> 
      <GradientStop Color="#FFEDED9A" Offset="0.496"/> 
     </LinearGradientBrush> 
    </Custom:C1DataGrid.HeaderBackground> 
    <Custom:C1DataGrid.Columns> 
     <!--<Custom:DataGridCheckBoxColumn Header="Code"/>--> 

     <Custom:DataGridTemplateColumn Header="Markets"> 
      <Custom:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding MarketCodeType.Market.NameA}"/> 
       </DataTemplate> 
      </Custom:DataGridTemplateColumn.CellTemplate> 
      <Custom:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox Name="cmbMarkets" ItemsSource= "{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.Markets,Mode=TwoWay}" 
DisplayMemberPath="NameA" SelectedValue="{Binding Path=MarketCodeType.Market.MarketID,Mode=TwoWay}" 
     SelectedValuePath="MarketCodeType.MarketID" 
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.selectedMarket,Mode=TwoWay}" /> 
       </DataTemplate> 
      </Custom:DataGridTemplateColumn.CellEditingTemplate> 
     </Custom:DataGridTemplateColumn> 


     </Custom:DataGridTemplateColumn> 
    </Custom:C1DataGrid.Columns> 

</Custom:C1DataGrid> 
+0

Вам не нужно устанавливать «SelectedItem» и «SelectedValue» – Shoe

+0

[Это сообщение] (http://www.zagstudio.com/blog/351#.UjSUXMZpmHg) описывает разницу между 'SelectedValue' и' SelectedItem'. – UIlrvnd

ответ

2

Резюмируя мой комментарий, ваше связывание должно быть либо:

<DataTemplate> 
    <ComboBox Name="cmbMarkets" DisplayMemberPath="NameA" 
       ItemsSource= "{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.Markets}" 
       SelectedItem="{Binding MarketCodeType.Market, Mode=TwoWay}"/> 
</DataTemplate> 

или (не так уверен об этом):

<DataTemplate> 
    <ComboBox Name="cmbMarkets" DisplayMemberPath="NameA" 
       ItemsSource= "{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.Markets}" 
       SelectedValue="{Binding MarketCodeType.Market.MarketID, Mode=TwoWay}" 
       SelectedValuePath="MarketID"/> 
</DataTemplate> 
+0

Спасибо, Стефан В много. первая привязка работает, вторая - нет, но у меня есть другой вопрос: если у вас нет ума, скажем, у меня есть другой столбец combobox в той же сетке, который связан со значением, выбранным на рынках combobox.eg: скажем, что рынок США имеет только 2 MarketCodeTypes, где вторая combobox содержит список всех типов marketcodetypes, которые я хочу отфильтровать этот список выбранной строки, отвечающей на вопрос selectedMarket.my, как я могу это реализовать? –

+0

Я немного смущен ... Вы имеете в виду, что хотите привязать второй combobox к одному и тому же свойству, но с другим ItemsSource? Ну, вы можете сделать это примерно так же (хотя вам может потребоваться добавить «UpdateSourceTrigger = PropertyChanged» для привязки SelectedItem для обоих), но я думаю, что это может быть немного запутанным ... Или вы хотите, чтобы связать с другим свойством ... Пожалуйста, уточните, пока я пытаюсь получить второе обязательное действие^_^... – UIlrvnd

+0

Если вы хотите привязать к 'RelativeSource = {RelativeSource FindAncestor, AncestorType = my: MarketsView}, Path = DataContext .selectedMarket', то это еще более запутанно, так как это одно свойство, правильно - не существует свойства, соответствующего каждому «Рынку» ... – UIlrvnd

Смежные вопросы