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