我是C#和wpf的新手。我有一个ChildWindow,它的标题是在类之外设置的。我需要的标题缩短与省略号在结尾,如果它太长。我是这样完成的(代码被缩短了):
<Namespace:ChildWindow
x:Class="Namespace.MyClass">
<Namespace:ChildWindow.Title>
<TextBlock x:Name="_titleBlock" Width="300" TextTrimming="WordEllipsis"/>
</Namespace:ChildWindow.Title>
</Namespace:Childwindow>但是,我希望这个类的调用者能够设置ChildWindow.Title = "Something long"而不是ChildWindow._titleBlock = "Something long",因为我认为这样做更有意义。有没有可能通过某种方式通过事件做到这一点?
发布于 2011-12-09 06:53:08
您真正想做的是使用MVVM模式将您的逻辑从视图中分离出来。这样,您就可以将ViewModel传递给操作子窗口的对象,而不是子窗口本身。
例如,子窗口的基本ViewModel可以是:
public class ChildWindowViewModel: INotifyPropertyChanged {
private string _title;
public string Title{
get { return _title; }
set{if (value != _title){
_title = value;
OnPropertyChanged("Title");
}}
}
private void OnPropertyChanged(string propertyName){
var handle = PropertyChanged;
if (handle != null){
handle(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}然后,在创建子窗口时将DataContext设置为视图模型,如下所示:
//Creating the child window
ChildWindow child = new ChildWindow();
ChildWindowViewModel childViewModel = new ChildWindowViewModel();
child.DataContext = childViewModel;
//do stuff with child...并将子窗口标题连接到Xaml中的ViewModel,如下所示:
<Namespace:ChildWindow
x:Class="Namespace.MyClass">
<Namespace:ChildWindow.Title>
<TextBlock Width="300" TextTrimming="WordEllipsis" Text="{Binding Path=Title}/>
</Namespace:ChildWindow.Title>
</Namespace:Childwindow>然后,当您想要更改标题时,您可以使用
childViewModel.Title = "A Very Long Title That Will Be Cut Short In Its Prime";在ViewModel上设置标题将触发PropertyChanged事件,该事件将导致Xaml视图使用新设置的值更新自身。这可能看起来像是一种非常冗长的工作方式,但如果你考虑一下这能让你在几分钟内做些什么,你会看到一些巨大的好处。装订远远超出了简单的标题文本...
希望这一切都能正常工作,但我是凭记忆做的,所以对于任何错误我深表歉意……
https://stackoverflow.com/questions/8438573
复制相似问题