我是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"
,因为我觉得它更有意义。是否有可能以某种方式通过事件来做到这一点?
答案 0 :(得分:0)
您真正想要做的是使用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设置为viewmodel:
//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视图使用新设置的值更新自身。这可能看起来像是一种非常冗长的做事方式,但如果你想一想这可以让你做几分钟,你就会看到一些巨大的好处。这种约束超越了简单的标题文本......
希望这一切都能按原样运作,但我是从记忆中做到的,所以对任何错误感到抱歉...