我有一个带有项目标题和内容模板 Select 器的选项卡控件

    <Grid.Resources>
        <DataTemplate x:Key="newTabButtonContentTemplate"/>

        <DataTemplate x:Key="newTabButtonHeaderTemplate">
            <Button Content="Add New Tab" Command="{Binding ElementName=parentUserControl, Path=DataContext.NewCommand}" 
                     HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
            </Button>
        </DataTemplate>

        <DataTemplate x:Key="itemContentTemplate" DataType="{x:Type localNS:ItemViewModel}">
            <views:Ladder DataContext="{Binding ItemLadderViewModel}"/>
        </DataTemplate>

        <DataTemplate x:Key="itemHeaderTemplate" DataType="{x:Type localNS:ItemViewModel}">
            <TextBlock Text="{Binding Header}"/>
        </DataTemplate>

        <templates:TemplateSelector x:Key="headerTemplateSelector"
                       NewButtonTemplate="{StaticResource newTabButtonHeaderTemplate}"
                       ItemTemplate="{StaticResource itemHeaderTemplate}"/>

        <templates:TemplateSelector x:Key="contentTemplateSelector"
                        NewButtonTemplate="{StaticResource newTabButtonContentTemplate}"
                        ItemTemplate="{StaticResource itemContentTemplate}"/>
    </Grid.Resources>
    

视图模型

MainWindowViewModel

    public MainWindowViewModel()
    {
        this.newCommand = new CustomDelegateCommand(
                () =>
                {
                    var itemViewModel = new ItemViewModel(); 
                    Items.Add(itemViewModel);
                    this.CurrentSelectedItem = itemViewModel;
                }
            );
    }

    private ObservableCollection<ItemViewModel> items;
    public ObservableCollection<ItemViewModel> Items
    {
        get
        {
            if (items == null)
            {
                items = new ObservableCollection<ItemViewModel>();
                var itemViewModel = new ItemViewModel();
                Items.Add(itemViewModel);
                this.CurrentSelectedItem = itemViewModel;
                var itemsView = (IEditableCollectionView)CollectionViewSource.GetDefaultView(items);
                itemsView.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtEnd;
            }

            return items;
        }
    }

    public ItemViewModel CurrentSelectedItem
    {
        get { return this.currentSelectedItem; }
        set
        {
            this.currentSelectedItem = value;
            this.OnPropertyChanged();
        }
    }

ItemViewModel

public class ItemViewModel : BindableBase
{
    private string header = "New Tab";
    private LadderViewModel itemLadderViewModel;

    public ItemViewModel()
    {
        itemLadderViewModel = new LadderViewModel();
        Messenger.Default.Register<Instrument>(this, "InstrumentChanged", instrument =>
        {
            this.Header = instrument.FullName;
        });
    }

    public LadderViewModel ItemLadderViewModel
    {
        get { return itemLadderViewModel; }
    }

    public string Header
    {
        get { return header; }
        set
        {
            header = value;
            OnPropertyChanged();
        }
    }
}

usercontrol有一个包含条目的组合框,如果 Select 了任何条目,则应使用该选定条目更改选项卡标题.我使用gala messenger在对象之间传递消息,因此当 Select combobox时,消息会被发送,并且标头会相应地更改,这也可以工作,但是

The problem is:它更改了所有选项卡的标题,我希望只有在该选项卡中 Select 了组合框项时才能更改选项卡的标题.

public class LadderViewModel : BindableBase
{
    private Instrument ladderInstrumentName = null;

    public Instrument LadderInstrumentName
    {
        get
        {
            return this.ladderInstrumentName;
        }
        set
        {
            this.ladderInstrumentName = value;
            Messenger.Default.Send<Instrument>(value, "InstrumentChanged");
        }
    }
}

我想知道这是否是正确的做法,如果是,问题是什么,如果不是,那么什么是正确的做法.

谢谢

推荐答案

MainWindowViewModel只能侦听messenger并更改选定选项卡的标题:

public MainWindowViewModel()
{
    this.newCommand = new CustomDelegateCommand(
            () =>
            {
                var itemViewModel = new ItemViewModel(); 
                Items.Add(itemViewModel);
                this.CurrentSelectedItem = itemViewModel;
            }
        );

    Messenger.Default.Register<Instrument>(this, "InstrumentChanged", instrument =>
    {
        if (CurrentSelectedItem != null) CurrentSelectedItem.Header = instrument.FullName;
    });
}

ItemViewModel没有订阅:

public ItemViewModel()
{
    itemLadderViewModel = new LadderViewModel();
    /*Messenger.Default.Register<Instrument>(this, "InstrumentChanged", instrument =>
    {
        this.Header = instrument.FullName;
    });*/
}

Csharp相关问答推荐

我应该将新的httpReportMessage()包装在using声明中吗?

. NET 8 HttpClient post参数将其情况更改为camel'

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

如何阻止注释被包含在C#release build. exe中

无法解析数据库上下文的服务

Unity中的刚体2D运动

Azure Redis缓存与Entra ID身份验证

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

为什么我的表单在绑定到对象时提交空值?

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

当前的文化决定了错误的文化

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

无法使用[FromForm]发送带有图像和JSON的多部分请求

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

如何使用ODP.NET C#设置Oracle会话时间长度限制

在.NET Maui中,Flyoutindow/Hamburger菜单可以在shell 之外实现吗?

正在try 将自定义字体添加到我的控制台应用程序

在C#和HttpClient中使用REST API

是否在异步方法中避免Span<;T>;.ToArray()?