関連する 2 つの ComboBox を DataGrid の Selected Item にバインドする例はありますか? 試してみましたが、うまく動作しないようです。私はMVVMにかなり慣れていないので、何か間違ったことをしています。
NewClient
ViewModel で
名前が付けられたオブジェクトのコレクションにバインドされたデータグリッドがありますClientMarketCodes
。
には、Market Navigation プロパティを持つClientMarketCodes
という名前のナビゲーション プロパティがあります。MarketCodeTypes
だから私はデータグリッドにコードを表示したい, MarketCodeTyeName
, MarketName
. 私はDataGrid コンボボックスでMarkets
とを表示することができましたが、との間の関係MarketCodeTypes
を作りたいと思っています。選択したアイテムをコンボボックスに追加しました。変更すると、コンボボックスにバインドされたコレクションの塗りつぶしメソッドが実行されますが、フィルターがコンボボックス列のすべての行に適用されるため、正しく機能しません。たとえば、両方のコンボボックスで何かが起こることがありますMarkets
MaketCodeTypes
MarketCodeTypes
Market
Markets
MarketCodeTypes
MarketCodeTypes
MarketCodetypes
Markets
1 つの行のコンボボックスには、他のすべての市場が表示されます。別の市場を 1 つ選択してクリックすると、その行は影響を受けず、元の市場に戻ります。なぜこれが起こるのかわかりません。
ここに私のビューモデルがあります:
public class MarketsViewModel : ObservableObject, IMarketsViewModel, INavigationAware, IConfirmNavigationRequest, IRegionMemberLifetime
{
#region MarketsViewModel
public MarketsViewModel()
{
//NewClient.ClientMarketCodes[0].MarketCodeType.MarketID
//MarketCodeTypes = new ObservableCollection<MarketCodeType>();
this.GetMarkets();
//this.GetMarketCodeTypes();
this.PropertyChanged += MarketssViewModel_PropertyChanged;
}
private void MarketssViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "selectedMarket":
{
if (selectedMarket != null)
{
GetMarketCodeTypes();
}
break;
}
}
}
#endregion
#region --Members--
private ObservableCollection<Market> m_Market;
private ObservableCollection<MarketCodeType> m_MarketCodeType;
private List<MarketCodeType> m_MarketCodeTypes;
public List<MarketCodeType> MarketCodeTypesList
{
get
{
if (m_MarketCodeTypes == null)
{
m_MarketCodeTypes = new List<MarketCodeType>();
}
return m_MarketCodeTypes;
}
set
{
m_MarketCodeTypes = value;
RaisePropertyChanged("MarketCodeTypesList");
RaisePropertyChanged("MarketCodeTypes");
}
}
public ObservableCollection<MarketCodeType> MarketCodeTypes
{
get
{
if (MarketCodeTypesList != null)
return new ObservableCollection<MarketCodeType>(MarketCodeTypesList);
else
return new ObservableCollection<MarketCodeType>();
}
}
#endregion
#region --Properties--
public ObservableCollection<Market> Markets
{
get { return m_Market; }
set
{
m_Market = value;
RaisePropertyChanged("Markets");
}
}
private Market _selectedMarket;
public Market selectedMarket
{
get { return _selectedMarket; }
set
{
if (_selectedMarket != value)
{
_selectedMarket = value;
RaisePropertyChanged("selectedMarket");
RaisePropertyChanged("MarketCodeTypes");
}
}
}
#endregion
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);
}
}
private void GetMarketCodeTypes()
{
try
{
MarketCodeType[] MarketCodeTypeArr;
using (var client = new ClientServiceProxy())
{
MarketCodeTypeArr = client.GetAllMarketCodeTypes().Where(c=>c.MarketID==selectedMarket.marketID).ToArray();
}
if (MarketCodeTypeArr != null)
{
MarketCodeTypesList = MarketCodeTypeArr.ToList();
}
else
{ MarketCodeTypesList = new List<MarketCodeType>(); }
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}`
これが私のXamlです:
<Grid x:Name="grid2" RenderTransformOrigin="0.5,0.5">
<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="???? ?????"/>-->
<Custom:DataGridTextColumn Header="Code" Binding="{Binding Code,Mode=TwoWay}" IsReadOnly="False" />
<Custom:DataGridTemplateColumn Header="MarketCodeType" >
<Custom:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MarketCodeType.NameA}"/>
</DataTemplate>
</Custom:DataGridTemplateColumn.CellTemplate>
<Custom:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="cmbMarketCodeTypes"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=my:MarketsView},Path=DataContext.MarketCodeTypes}"
DisplayMemberPath="NameA"
SelectedValue="{Binding Path=MarketCodeTypeID,Mode=TwoWay,ValidatesOnDataErrors=True}"
/>
</DataTemplate>
</Custom:DataGridTemplateColumn.CellEditingTemplate>
</Custom:DataGridTemplateColumn>
<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>