【发布时间】:2014-03-04 08:55:03
【问题描述】:
我有一个特定的场景。我的应用程序看起来像这样。
在左侧有一些用户列表,这是一个列表框,在右侧有几个字段是数据绑定到左侧。它的工作原理是,如果您在右侧选择“用户 1”,则会出现用户 1 的相关信息,您可以修改该信息,并且它是与 "UpdateSourceTrigger=PropertyChanged" 的数据绑定,因此它也会立即反映在左侧。其他用户的情况相同。
现在的问题是,如果我选择多个用户并编辑字段 3,它是可编辑的文本框。现在,如果我选择用户 1 并编辑此文本框,它会反映在用户 1“注意:...”中,如果我选择用户 2 并编辑字段 3,它会更新用户 2“注意:...”但如果多选我如何实现呢?假设我想同时选择用户 1 和用户 2 并编辑注释字段它应该更新用户 1 和用户 2 的注释字段并且数据绑定也应该工作我的意思是它应该立即将我输入到文本框中的文本。有什么想法可以实现吗?
目前在我的 viewModel 中
型号
public String Note
{
get
{
return (String)GetValue(NoteProperty);
}
set { SetValue(NoteProperty, value); }
}
查看
在 XAML 中,用户列表框项模板是这样定义的
<TextBlock Text="{Binding Note, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
在 XAML 中,右侧的文本框(字段 3)以相同的方式绑定数据
<TextBox Text="{Binding Note, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
如何实现多用户数据绑定?
请帮助并给我一些想法。
编辑:
转换器:
public class MultiBindingConverter : IValueConverter
{
ObservableCollection<Info> mycollection;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var coll = (ObservableCollection<Info>)value;
mycollection = coll;
if (coll.Count == 1)
{
if (parameter.ToString() == "FNote")
return coll[0];
}
else if (coll.Count > 1)
{
// string name = coll[0].FirstName;
if (parameter.ToString() == "FNote")
{
string name = coll[0].Note;
foreach (var c in coll)
{
if (c.Note != name)
return null;
else continue;
}
return name;
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter.ToString() == "FNote")
{
foreach (var c in mycollection)
{
c.Note = value.ToString();
}
return mycollection;
}
return null;
}
}
对我来说,只有一个 TextBox Editable NoteTextBox 需要与多个用户进行数据绑定。
在我的视图模型中
我写过
视图模型
private Command selectionChangedCommand;
public Command SelectionChangedCommand
{
get
{
if (selectionChangedCommand == null)
{
selectionChangedCommand = new Command(SelectionChanged, true);
}
return selectionChangedCommand;
}
set { selectionChangedCommand = value; }
}
public void SelectionChanged(object value)
{
selectedItem = new ObservableCollection<Info>((value as IEnumerable).OfType<Info>());
}
private ObservableCollection<Info> selectedItem;
public ObservableCollection<Info> SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
PropertyChanged("SelectedItem");
}
}
Info 类中有一个属性Note 需要绑定到视图的两个位置。
【问题讨论】:
-
如果您需要在
Field3中添加多个注释,那么您必须包含一个单独的逻辑来分隔字段,以便您可以确定哪个注释来自哪个用户。跨度> -
我不明白为什么需要单独登录?我将选择说两个用户并更新它将反映在 user1 和 user2 字段中的注释字段。
-
我可以为 user1、user2 和 user3 设置不同的注释吗?
-
因为选择更改时需要填充注释字段。您填充它的内容取决于有多少选择。这是逻辑,不是直接绑定。
-
这里有一个转换器可以帮助您实现特定属性的自定义绑定。
标签: c# wpf xaml mvvm data-binding