C# 包含UserControl的Viewmodel-UserControl属性重置

C# 包含UserControl的Viewmodel-UserControl属性重置,c#,wpf,xaml,C#,Wpf,Xaml,我有一个主窗口viewmodel,它正在创建usercontrol的一个实例,并且在一个特定的函数中,通过代码设置usercontrol的一个属性,即 // Set Button Width Height var potentialHeight = (SelectorUCViewModel.GridHeight / SelectorUCViewModel.ColumnCount) - (SelectorUCViewModel.Button

我有一个主窗口viewmodel,它正在创建usercontrol的一个实例,并且在一个特定的函数中,通过代码设置usercontrol的一个属性,即

        // Set Button Width Height
        var potentialHeight = (SelectorUCViewModel.GridHeight / 
            SelectorUCViewModel.ColumnCount) - (SelectorUCViewModel.ButtonMarginToUse * 2);
        var potentialWidth = (SelectorUCViewModel.GridWidth / 
            SelectorUCViewModel.RowCount) - (SelectorUCViewModel.ButtonMarginToUse * 2);
        SelectorUCViewModel.ButtonHeightWidth = (potentialHeight < potentialWidth) ? potentialHeight : potentialWidth;
mainwindow视图设置mainwindowviewmodel的数据上下文

    public MainWindow()
    {
        InitializeComponent();
        viewModel = new MainWindowViewModel(model);
        DataContext = viewModel;

        SourceInitialized += Window1_SourceInitialized;
    }

我真的不明白哪里出了问题-没有绑定错误,但由于将代码从viewmodel转移到usercontrol(试图从vm中尽可能多地抽象),所以工作不正常…

“正在创建usercontrol实例的viewmodel”-根据MVVM,这通常是错误的。viewmodel不能创建任何UI项(用户控件)。考虑重新设计你的方法。那么我怎样才能让我的VIEW模型与我的USER控件交互呢?i、 e.谁应该创建usercontrol的实例?我的按钮ICommand没有从viewmodel在usercontrol上触发,因此我怀疑有问题,即使绑定没有出现问题viewmodel必须设置usercontrol的属性。。。所以我不知道该怎么做这些是MVVM的基本内容。viewmodel通过数据绑定和事件与其视图交互。视图的实例应由框架(WPF)通过数据模板、样式和内容模板创建。视图实例也可以由服务(如导航服务、用户交互服务等)创建,但不能由viewmodels创建。因此,如果要在视图中创建usercontrol,我将如何做到这一点?正如您在上面看到的,我已经有了,我是否需要更改XAML以使其以编程方式生成usercontrol?那么我是否需要为视图(viewmodel)触发事件以与usercontrol交互?我努力在脑海中想象它
<UserControl x:Class="SelectorUC"
             x:Name="UC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Selector"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid Name="mainGrid" DockPanel.Dock="Left" MouseDown="MainGrid_MouseDown" MouseUp="MainGrid_MouseUp" MouseMove="MainGrid_MouseMove" Background="Transparent" 
                                      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                      MinWidth="{Binding GridWidth}" Height="{Binding GridHeight}">
        <ItemsControl x:Name="objItemControl" ItemsSource="{Binding ObjCompositeCollection}">
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Grid.Row" Value="{Binding Row}"/>
                    <Setter Property="Grid.Column" Value="{Binding Column}"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid DockPanel.Dock="Top" HorizontalAlignment="Stretch" 
                                                 VerticalAlignment="Stretch" Name="grid" Grid.Row="1" 
                                                 Width="{Binding MinWidth, ElementName=mainGrid}" 
                                                 Height="{Binding Height, ElementName=mainGrid}"
                                                 GridHelper.RowCount="{Binding RowCount}"
                                                 GridHelper.ColumnCount="{Binding ColumnCount}" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.Resources>
                <DataTemplate DataType="{x:Type ObjA}">
                    <ToggleButton Content="{Binding Id}"
                                                        Tag="{Binding Id}"
                                                        IsChecked="{Binding IsSelected}"
                                                        Height="{Binding Path=ButtonHeightWidth, ElementName=UC}"
                                                        Width="{Binding Path=ButtonHeightWidth, ElementName=UC}"
                                                        HorizontalAlignment="Stretch"
                                                        VerticalAlignment="Stretch"
                                                        Margin="{Binding Path=ButtonMarginToUse, ElementName=UC}"
                                                        Padding="2"
                                                        PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown"
                                                        PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp"
                                                        MouseEnter="Button_MouseEnter"
                                                        MouseLeave="Button_MouseLeave"
                                                        Style="{StaticResource ObjButton}">
                    </ToggleButton>
                </DataTemplate>
                <DataTemplate DataType="{x:Type GridLabeller}">
                   <TextBlock Text="{Binding HeaderName}" Style="{StaticResource GridHeaders}"/>
                </DataTemplate>
            </ItemsControl.Resources>
        </ItemsControl>
        <Canvas>
            <Rectangle x:Name="selectionBox" Visibility="Collapsed" Stroke="{StaticResource ResourceKey=SecondaryThemeColour}" StrokeThickness="2" StrokeDashArray="2,1"/>
        </Canvas>
    </Grid>
</UserControl>
    private int buttonHeightWidth;
    public int ButtonHeightWidth
    {
        get { return buttonHeightWidth; }
        set
        {
            buttonHeightWidth = value;
            OnPropertyChanged(nameof(ButtonHeightWidth));
        }
    }

    private int buttonMarginToUse = 2;
    public int ButtonMarginToUse
    {
        get { return buttonMarginToUse; }
        set
        {
            buttonMarginToUse = value;
            OnPropertyChanged(nameof(ButtonMarginToUse));
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        viewModel = new MainWindowViewModel(model);
        DataContext = viewModel;

        SourceInitialized += Window1_SourceInitialized;
    }