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 に答える