WPF 数据绑定

xujiaoxiang 2011-11-17 09:10:41
使用MVVM,vm中有一个SearchKey属性,和View中的TextBox绑定,

View中有一个TextBox和一个ListBox,其中,TextBox对应VM中的SearchKey,ListBox对应VM中的SearchHistory。

class VM
{
public string SearchKey{get;set;}
public List<SearchItem> SearchHistory{get;set;}
}

现在当ListBox的SelectedItem改变时,TextBox中的内容设置为ListBox.SelectedItem.Key。
1、要求TextBox与SearchKey的绑定不变
2、不修改VM类。

view.xaml
<TextBox Text="{Binding SearchKey}"/>
<ListBox DataSource="{Binding SearchHistory}" SelectedItem="????"/>

请问,在xaml中如何实现?trigger?还是SelectedItem="????"?
具体代码怎么写,谢谢
...全文
148 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fallincloud 2011-11-18
  • 打赏
  • 举报
回复
初次使用WPF,感觉思考方式完全不同了。

很奇怪xaml中无法实现。
理论上可以实现,而实际中没有实现,必定存在某种原因或替代方式。
而了解这个原因或方法,对自己的设计思想有很多帮助。
这就是我为什么纠缠在这个问题上的原因。

我会去寻找原因或替代方式(也许就是SelectionChanged,突然想到,SelectionChanged可以通过xaml来实现吧?)。


WPF中一个很重要的理论:所有XAML中可以实现的都可通过后台代码实现,但反之则不一定。

一般的界面中的显示可以通过绑定VM的属性(当需要显示的值变化,则是修改VM中的属性,因VM实现了INotifyPropertyChanged接口,因此界面上的数据和Model中的数据都通过VM来实现更新了),按钮点击绑定到VM的Command,而更加复杂的逻辑可能就需要调用VM的公开方法——这是标准的MVVM设计思想。
更多的详细资料请参考MSDN对MVVM模式的用法的介绍http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
xujiaoxiang 2011-11-18
  • 打赏
  • 举报
回复
<ListBox DataSource="{Binding SearchHistory}" SelectedItem="{Binding Path=SearchKey, Mode=OneWayToSource,Converter={StaticResource SearchKeyConverter}}"/>
这是通过VM中的SearchKey中转的,我想应该有办法直接更新TextBox的内容吧?

xujiaoxiang 2011-11-18
  • 打赏
  • 举报
回复
To taomanman

谢谢你的回复

我说的不清楚。

TextBox是输入的,需要和VM的SearchKey绑定。
ListBox是辅助的,用户可以通过它选择,也可以不。当选择时将TextBox的内容设置为选择的SelectedItem.Key(View中还有其他的相关控件,如SearchType等等,也要同时设置)。
暖枫无敌 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xujiaoxiang 的回复:]

To bo111
VM中需要使用SearKey检索

To taomanman
<ListBox DataSource="{Binding SearchHistory}" SelectedItem="{Binding Path=SearchKey, Mode=OneWayToSource,Converter={StaticResource SearchKeyConverter}}"/>
……
[/Quote]
那你就设置TextBox的Text绑定的是ListBox的SelectedItem值
xujiaoxiang 2011-11-18
  • 打赏
  • 举报
回复
To bo111
VM中需要使用SearKey检索

To taomanman
<ListBox DataSource="{Binding SearchHistory}" SelectedItem="{Binding Path=SearchKey, Mode=OneWayToSource,Converter={StaticResource SearchKeyConverter}}"/>

我是这样做的,不过我想知道有没有什么办法,在ListBox的SelectedItem变化时Set TextBox.Text
fallincloud 2011-11-18
  • 打赏
  • 举报
回复
SelectionChanged是用来处理复杂逻辑时很有用,话说这是最后的方法,但也是最万能的方法。

当切换条目时,在XAML中处理起来不知道如何下手或者是很麻烦时,可以通过SelectionChanged事件来处理,然后再仔细观察处理函数,看函数中有没有合适的逻辑可以移到VM中——其实就是我们常用的编程思想:先实现,再重构当初实现时未考虑清楚的。
xujiaoxiang 2011-11-18
  • 打赏
  • 举报
回复

我并不排斥在xaml.cs中添加代码,我不太喜欢SelectionChanged事件。
SelectedItem变化时已经通过依赖属性的方式发出消息了,我认为SelectionChanged只是向后兼容的目的吧。
xujiaoxiang 2011-11-18
  • 打赏
  • 举报
回复
TO fallincloud

我认为在VM中的实现方式是最佳的。

我的这个问题的根本原因是,
VM中记录的是SearchKey SearchType等,而不是SearchItem。
其实只要在VM中添加SearchItem,并删除SearchKey SearchType等property就可以很好的实现功能,并且规范标准。
这样,View中的 TextBox 只要Binding SearchItem.Key
fallincloud 2011-11-18
  • 打赏
  • 举报
回复
就是让原来CS文件中的逻辑
private void ListBoxTest_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems != null && e.AddedItems.Count >= 1)
{
SearchItem si = e.AddedItems[0] as SearchItem;
if (si != null)
{
(this.DataContext as VM).SearchKey = si.Name;
}
}
}

移到VM中:


private SearchItem _si;
public SearchItem CurrentSearchItem
{
get { return _si; }
set
{
if (_si == value)
return;

_si = value;
NotifyPropertyChanged("CurrentSearchItem");
SearchKey = CurrentSearchItem == null ? String.Empty : CurrentSearchItem.Name;
}
}


XAML对应修改为:

<TextBox Text="{Binding SearchKey}" Margin="5 10" ></TextBox>
<ListBox ItemsSource="{Binding SearchHistory}" x:Name="ListBoxTest" SelectedValue="{Binding CurrentSearchItem}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>


示例代码在http://dl.dbank.com/c0s2jaoerd#的WPFListBoxTest.7z
fallincloud 2011-11-18
  • 打赏
  • 举报
回复
不过我现在又想到了个方法,你这套逻辑并不是很复杂,有种方法能让XAML对应的CS没有任何额外的代码
暖枫无敌 2011-11-17
  • 打赏
  • 举报
回复
<ListBox DataSource="{Binding SearchHistory}" SelectedItem="{Binding Path=SearchKey, Mode=TwoWay}"/>

品铭工作室 2011-11-17
  • 打赏
  • 举报
回复
很长时间没有写这个了,你就是想选择listbox中的一项时,textBox就显示选中的值
SearKey这个没有用了
用TextBox直接去Binding ListBox中的SelectItem
我不记得:应该象这样子
<TextBox Text="{Binding ElementName=ListBoxName,Path=SelectedItem.SearchKey}" />

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧