为了缩短,假设我有一个带有组合框的Datagrid、一个TextBox和另一个combobox。我想根据第一个组合选择的值显示或隐藏文本或组合框
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ComboBox x:Name="cboThenConstOrCol" SelectedIndex="0" SelectedItem="{Binding Source={StaticResource VM}, Path=cboElseSelectedItem, Mode=TwoWay}">
<ComboBoxItem Content="None"/>
<ComboBoxItem Content="Const" />
<ComboBoxItem Content="Col"/>
</ComboBox>
<TextBox Grid.Column="1" Text="{Binding ElseConst}" Visibility="{Binding Source={StaticResource VM}, Path= IsVisibleElseConst}" IsTabStop="{Binding Source={StaticResource VM}, Path=isElseConstTabStop}"></TextBox>
<ComboBox Grid.Column="1" ItemsSource="{Binding Source={StaticResource VM}, Path=Fields,Mode=OneWay}" Visibility="{Binding Source={StaticResource VM}, Path= IsVisibleElseCol}" DisplayMemberPath="FieldName" />
</Grid>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
在我的Viewmodel中,我负责显示或隐藏,并且工作正常,但问题是当我使文本框可见时,所有行中的所有文本框都变为可见。我只想应用于组合框selecteditem已更改的行。我希望我清楚,否则请让我知道添加更多信息。感谢
据我所知,您有一个ViewModel可以控制一切。我认为你在做这件事时会遇到问题,虽然一开始做这样的事情看起来更容易,但当引入任何复杂性时,肯定不会。我要做的是更多地接受MVVM,并为每个Row所代表的项目创建ViewModel。这允许每一行都保持自己的状态。以下是一个基于您所提供内容的示例:
修改的XAML(不完整):
<UserControl.Resources>
<local:VM
x:Key="vm" />
</UserControl.Resources>
<Grid
DataContext="{StaticResource vm}"
x:Name="LayoutRoot"
Background="White">
<sdk:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Items}">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox
ItemsSource="{Binding Source={StaticResource vm}, Path=Options}"
SelectedItem="{Binding Selected, Mode=TwoWay}" />
<TextBox
Grid.Column="1"
Text="Else"
Visibility="{Binding TextVisible}" />
</Grid>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
Items是包含"ItemViewModel"的集合。此处的主要更改是数据模板中的绑定现在映射到"ItemViewModel"的属性。例外情况是ComboBox的ItemSource(包含"None"、"Const"one_answers"Col"值),它绑定到主VM。
主VM:
public class VM : INotifyPropertyChanged
{
private readonly ObservableCollection<ItemViewModel> items = new ObservableCollection<ItemViewModel>();
private readonly ObservableCollection<string> options = new ObservableCollection<string>();
public ObservableCollection<ItemViewModel> Items { get { return items; } }
public ObservableCollection<string> Options { get { return options; } }
public VM()
{
options.Add("None");
options.Add("Const");
options.Add("Col");
//Create some dummy items
for (int i = 0; i < 10; i++)
{
var item = new ItemViewModel();
item.Name = i.ToString();
item.Selected = options[0];
items.Add(item);
}
}
//INotifyPropertyChanged stuff
项目VM:
public class ItemViewModel : INotifyPropertyChanged
{
private string selected;
private Visibility textVisible;
public string Selected
{
get { return selected; }
set
{
if (!string.IsNullOrWhiteSpace(value))
{
switch (value.ToLower())
{
case "none":
TextVisible = Visibility.Collapsed;
break;
case "const":
TextVisible = Visibility.Visible;
break;
case "col":
TextVisible = Visibility.Visible;
break;
}
}
selected = value;
}
}
public Visibility TextVisible
{
get { return textVisible; }
set
{
textVisible = value;
RaisePropertyChanged("TextVisible");
}
}
//INotifyPropertyChanged stuff
}
您可以在这里看到,当更改此项的选定值时,会运行一些逻辑来确定文本是否可见。
这有一些错误,但希望它能让你走上正确的道路。