为了缩短,假设我有一个带有组合框的Datagrid和一个TextBox,以及另一个Combobox。我想根据第一个Combo
选择的值显示或隐藏文本或组合框 <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中我正在处理显示或隐藏并且工作正常,但问题是当我使文本框可见时,所有行中的所有文本框都变得可见。我想要的只是应用于组合框选择项已被更改的行。我希望我很清楚,否则请让我知道添加其他信息。感谢
答案 0 :(得分:1)
从我可以收集到的内容中,你有一个控制一切的ViewModel。我认为你会遇到这样的问题,虽然起初这样的事情似乎更容易,但绝对不是在引入任何复杂性时。我要做的是更多地接受MVVM,并为每个行代表的项目创建一个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'和'Col'值),它们绑定到主虚拟机。
主虚拟机:
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
}
您可以在此处看到,当为此项目更改选定值时,会运行一些逻辑来确定文本是否应该可见。
这有一些问题,但希望它能让你走上正确的道路。