1

我是 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"因为我认为它更有意义。是否有可能通过事件以某种方式做到这一点?

4

1 回答 1

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 设置为视图模型,如下所示:

//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 视图使用新设置的值更新自身。这似乎是一种非常冗长的做事方式,但如果您考虑一下这可以让您做什么几分钟,您会看到一些巨大的好处。绑定超出了简单的标题文本......

希望一切都能按原样工作,但我是凭记忆做的,对任何错误感到抱歉......

于 2011-12-08T22:53:08.383 回答