これはちょっとハッキーですが、私はそれを働かせました(私があなたが望むものを理解していると仮定して)。XAMLで
class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
this.data.Add(1, "One");
this.data.Add(2, "Two");
this.data.Add(3, "Three");
}
Dictionary<int, string> data = new Dictionary<int, string>();
public IDictionary<int, string> Data
{
get { return this.data; }
}
private KeyValuePair<int, string>? selectedKey = null;
public KeyValuePair<int, string>? SelectedKey
{
get { return this.selectedKey; }
set
{
this.selectedKey = value;
this.OnPropertyChanged("SelectedKey");
this.OnPropertyChanged("SelectedValue");
}
}
public string SelectedValue
{
get
{
if(null == this.SelectedKey)
{
return string.Empty;
}
return this.data[this.SelectedKey.Value.Key];
}
set
{
this.data[this.SelectedKey.Value.Key] = value;
this.OnPropertyChanged("SelectedValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
var eh = this.PropertyChanged;
if(null != eh)
{
eh(this, new PropertyChangedEventArgs(propName));
}
}
}
そして:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ListBox x:Name="ItemsListBox" Grid.Row="0"
ItemsSource="{Binding Path=Data}"
DisplayMemberPath="Key"
SelectedItem="{Binding Path=SelectedKey}">
</ListBox>
<TextBox Grid.Row="1"
Text="{Binding Path=SelectedValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
Data
プロパティの値がListBox
のItemsSource
にバインドされている
は、私が最初のビューモデルクラスを作成しました。質問に記載されているように、この結果、のインスタンスが
ListBox
の背後にあるデータとして使用されます。
DisplayMemberPath
を
Key
に設定し、キーの値が
ListBox
の各項目の表示値として使用されるようにしました。
あなたが見つけたので、KeyValuePair
のValue
をTextBox
のデータとして使用することはできません。これは読み取り専用であるためです。その代わりに、TextBox
は、現在選択されているキーの値を取得して設定できるビューモデルのプロパティにバインドされています(ビューモデルの別のプロパティにListBox
のSelectedItem
プロパティをバインドすることによって更新されます)。私はこのプロパティをnullableにする必要がありました(KeyValuePair
は構造体です)、選択がないときにコードが検出できるようにしなければなりませんでした。
私のテストアプリケーションでは、TextBox
を編集してビューモデルのDictionary
に伝播しているようです。
あなたは何をやっているのですか?それは少しきれいにする必要があるようだが、そうする方法があるかどうかわからない。代わりに
Dictionary<string, int>
の
の独自のバージョンを実装することができますか? – Rauhotz
どうやってそれを2つにするつもりですか?値はTextBoxに表示されていますか? – Ray
@レイ私は私の値のためのカスタムエディタを持っています。 TextBoxを使った例があれば、自分のニーズを満たすことができると確信しています。 –