我的目標是通過兩個不同的文本框更新單個Size屬性。特別是每個組件都連接到單個文本框(在下面的XAML中突出顯示)。具體這行:{綁定路徑= Dimensions.Width,...}將單個屬性的單個組件綁定到WPF中的兩個單獨控件
private Size _dimension;
public Size Dimensions
{
get { return _dimension; }
set
{
_dimension = value;
OnPropertyChanged("Dimensions");
}
}
我的XAML如下:
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Label Content="Width" />
<TextBox Width="50" Text="{Binding Path=Dimensions.Width,
Converter={StaticResource myStringToDoubleConverter},
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<Label Content="Height" />
<TextBox Width="50" Text="{Binding Path=Dimensions.Height,
Converter={StaticResource myStringToDoubleConverter},
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
我的問題是所設定的功能不叫當我改變文本框中的文本時。我想是因爲我沒有提供一個Size對象,但最好是一個double對象,最壞的情況是一個字符串。我在那裏有一個轉換器來將字符串轉換爲double,但它似乎並不是個竅門。我的感覺是Multibinding產生我的解決方案,但是我看到的所有例子都是將兩個字符串合併到第三個控件中。我對使用附加值進行控制並不感興趣,而是更新我的「複雜」屬性的組件。
我明白我可以製作兩個「sub」屬性,Height和Width,然後一次更新一個Dimension的屬性,但似乎應該存在一個更優雅的解決方案。
爲什麼我的文本框不能正確綁定到Dimension屬性的單個組件並相應地更新維度?
構建一個實現INotifyPropertyChanged的包裝類似乎過分了。
public class MySizeClass : Size, INotifyPropertyChanged
我認爲你的答案是一個合理的解決方案。你原來的帖子中的代碼肯定有一些問題:1.你只能設置寬度,而不是高度。 2.您的轉換器如何將寬度轉換爲大小而不知道其高度?你如何堅持以前尺寸對象的高度? –
@BillZhang轉換器實際上只是將字符串更改爲Double,而不是大小。要轉換爲尺寸,我需要以某種方式獲取高度參數。我不清楚,那實際上是可能的。除非我的轉換器做了一些特殊的地方,它只更新兩個組件之一。例如:return(new Size(input,this.Height)),但這並不是特別優雅,可能更糟糕...... 編輯:將OP中的代碼調整爲更統一。 – mwjohnson
這將是顯而易見的。由於沒有隱式轉換器將Size轉換爲double,因此您的Size屬性絕對不會被調用。由於View Model是View的一個特殊模型,因此您應該考慮View如何方便地使用它的Model。 –