C# 列定义的绑定宽度不为';不能使用GridUnitType.Star

C# 列定义的绑定宽度不为';不能使用GridUnitType.Star,c#,wpf,C#,Wpf,我需要在程序中更改columnDefinition的宽度和rowDefinition的高度,因此绑定对我来说是一个不错的选择。 我尝试将网格的ColumnDefinition的宽度和RowDefinition的高度绑定到对象“StrategyObject”的属性。 对于演示,我们尝试更改以下网格的列和行的大小(请参见屏幕截图) 我对抽象类“BaseStrategyObject”使用策略模式: 以下是三个具体的startegy等级: public class Strategy1Object : B

我需要在程序中更改columnDefinition的宽度和rowDefinition的高度,因此绑定对我来说是一个不错的选择。 我尝试将网格的ColumnDefinition的宽度和RowDefinition的高度绑定到对象“StrategyObject”的属性。 对于演示,我们尝试更改以下网格的列和行的大小(请参见屏幕截图)

我对抽象类“BaseStrategyObject”使用策略模式:

以下是三个具体的startegy等级:

public class Strategy1Object : BaseStrategyObject
{
    public Strategy1Object()
    {
        this.gridFirstColumnWidth = new GridLength(1, GridUnitType.Star);
        this.gridFirstRowHeight = new GridLength(1, GridUnitType.Star);
        this.gridSecondColumnWidth = new GridLength(1, GridUnitType.Star);
        this.gridSecondRowHeight = new GridLength(1, GridUnitType.Star);
    }
}

public class Strategy2Object : BaseStrategyObject
{
    public Strategy2Object()
    {
        this.gridFirstColumnWidth = new GridLength(80, GridUnitType.Star);
        this.gridFirstRowHeight = new GridLength(1, GridUnitType.Star);
        this.gridSecondColumnWidth = new GridLength(20, GridUnitType.Star);
        this.gridSecondRowHeight = new GridLength(1, GridUnitType.Star);
    }
}

public class Strategy3Object : BaseStrategyObject
{
    public Strategy3Object()
    {
        this.gridFirstColumnWidth = new GridLength(80.0, GridUnitType.Pixel);
        this.gridFirstRowHeight = new GridLength(200.0, GridUnitType.Pixel);
        this.gridSecondColumnWidth = new GridLength(200.0, GridUnitType.Pixel);
        this.gridSecondRowHeight = new GridLength(80.0, GridUnitType.Pixel);
    }
}
窗口的Xaml代码:

<Window x:Class="GridAsteriskBindingtest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<DockPanel>
    <StackPanel DockPanel.Dock="Bottom" HorizontalAlignment="Center" Orientation="Horizontal">
        <Button Click="Strategy1_Click">Strategy1</Button>
        <Button Click="Strategy2_Click">Strategy2</Button>
        <Button Click="Strategy3_Click">Strategy3</Button>
    </StackPanel>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="{Binding Mode=OneWay, Path=StrategyObject.GridFirstRowHeight}"/>
            <RowDefinition Height="{Binding Mode=OneWay, Path=StrategyObject.GridSecondRowHeight}"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="{Binding Mode=OneWay, Path=StrategyObject.GridFirstColumnWidth}"/>
            <ColumnDefinition Width="{Binding Mode=OneWay, Path=StrategyObject.GridFirstColumnWidth}"/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Row="0" Grid.Column="0"
            Fill="Red"/>
        <Rectangle Grid.Row="0" Grid.Column="1"
            Fill="Yellow"/>
        <Rectangle Grid.Row="1" Grid.Column="0"
            Fill="Blue"/>
        <Rectangle Grid.Row="1" Grid.Column="1"
            Fill="Green"/>
    </Grid>
</DockPanel>
public partial class MainWindow : Window , INotifyPropertyChanged
{
    private BaseStrategyObject strategyObject;
    public BaseStrategyObject StrategyObject
    {
        get { return this.strategyObject; }
        set
        {
            this.strategyObject = value;
            OnStrategyObjectChanged();
        }
    }

    public MainWindow()
    {
        this.strategyObject = new Strategy1Object();

        InitializeComponent();
    }

    private void Strategy1_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy1Object();
    }

    private void Strategy2_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy2Object();
    }

    private void Strategy3_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy3Object();
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnStrategyObjectChanged()
    {
        if(this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("StrategyObject"));
    }

    #endregion
}
单击按钮将新对象应用于“StrategyObject”属性

当我们启动该程序时,策略3(具有特定大小的GridUnit.Pixel)可以很好地工作,但它不适用于其他两种策略(策略1和策略2(不考虑星星的数量:-())

下面是截图(策略1和策略2给出了相同的结果)


我做错什么了吗?谢谢!

你能展示一下应用策略的结果吗?你有没有尝试在更改StrategyObject后调用你的Grid.UpdateLayout()?this.StrategyObject=new Strategy2OObject();this.UpdateLayout();不幸的是,这没有什么区别。(结果已经添加)我想给你的网格命名(
),然后
this.StrategyObject=new Strategy2Object();this.grid1.UpdateLayout();
试试看。。
public partial class MainWindow : Window , INotifyPropertyChanged
{
    private BaseStrategyObject strategyObject;
    public BaseStrategyObject StrategyObject
    {
        get { return this.strategyObject; }
        set
        {
            this.strategyObject = value;
            OnStrategyObjectChanged();
        }
    }

    public MainWindow()
    {
        this.strategyObject = new Strategy1Object();

        InitializeComponent();
    }

    private void Strategy1_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy1Object();
    }

    private void Strategy2_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy2Object();
    }

    private void Strategy3_Click(object sender, RoutedEventArgs e)
    {
        this.StrategyObject = new Strategy3Object();
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnStrategyObjectChanged()
    {
        if(this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("StrategyObject"));
    }

    #endregion
}